2015-11-03 69 views
1

我對這個有點困惑。我閱讀了有關MSDN上this文章的元數據類。元數據類是否與asp.net MVC中的ViewModel相同?

它說創建元數據的原因並不是由EF自動生成模型。

因此,這是由EF生成的模型:

namespace Blog.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Article 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Article() 
     { 
      this.ArticleTags = new HashSet<ArticleTag>(); 
      this.Comments = new HashSet<Comment>(); 
     } 

     public int ArticleID { get; set; } 
     public string PostTitle { get; set; } 
     public string PostContent { get; set; } 
     public string PostLinkText { get; set; } 
     public Nullable<System.DateTime> PostDateTime { get; set; } 
     public Nullable<int> PostAuthorID { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<ArticleTag> ArticleTags { get; set; } 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Comment> Comments { get; set; } 
     public virtual Admin Admin { get; set; } 
    } 
} 

,這是條模型元數據類:

public class ArticleMetadata 
    { 
     [Display(Name = "Post Title")] 
     public string PostTitle { get; set; } 

     [Display(Name = "Content")] 
     public string PostContent { get; set; } 

     [Display(Name = "Link Text")] 
     public string PostLinkText { get; set; } 

     [Display(Name = "Post Date and Time")] 
     public DateTime? PostDateTime { get; set; } 

     [Display(Name = "Post Author")] 
     public int? PostAuthorID { get; set; } 
    } 

連接使用PartialClasses.cs模型類:

[MetadataType(typeof(ArticleMetadata))] 
public partial class Article 
{ 
} 

元數據類是否與ViewModel相同?

如果是這樣,這些不同之處是什麼,應該在我的情況下使用哪一個?

回答

1

class ArticleMetadataclass Article的幫助類,因爲否則無法將這些註釋屬性添加到特定屬性。
它們一起構成了MVC的模型部分。

請注意,部分類無法幫助屬性,因爲它無法重新定義它們。這裏僅用於鏈接MetaData類。

對於非常簡單的操作(CRUD頁面),您可以直接使用模型。在所有其他情況下,爲每個視圖創建一個ViewModel。文章模型可能會被EditArticleViewModel使用。

一般來說,您應該創建ViewModels來支持Views,而不是每個Model的一個。一個ViewModel可以由幾個Model類的數據組成。

+0

所以,如果我爲每個模型創建一個視圖模型,那麼我可以刪除元數據類,對吧? – VSG24

+1

在這種情況下是的。但是您應該創建ViewModel for Views,而不是爲每個模型創建ViewModels。一個ViewModel可以使用來自幾個Model類的數據。 –

+0

我同意亨克的評論。爲了解決這個問題,您可能希望使用映射器將ViewModel屬性映射到實體屬性,如[AutoMapper](http://automapper.org)。這使您可以使ViewModel獨立於實體Model,但您可以輕鬆地在模型之間來回傳遞數據,就像您在處理實體模型時一樣。只是一個想法。 – Blake

2

不,他們是不一樣的。

元數據類允許您爲班級成員定義/添加限制。

查看模型通常用於更容易在視圖中使用模型。如具有SelectListItems列表的下拉列表,具有接受表單發佈值的屬性等。

這兩者通常結合使用,在元數據類中添加驗證,並通過視圖模型執行驗證。

在您的具體情況下,您似乎只需要一個元數據類。

+0

你能提供一個一起使用的元數據和viewmodel的例子嗎? – VSG24

相關問題