2015-11-03 43 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

相关问题