元数据类是否与asp.net MVC中的ViewModel相同?

时间:2015-11-03 17:02:16

标签: c# asp.net-mvc entity-framework

我对这个感到有点困惑。我在MSDN上的this文章中了解了元数据类。

它说创建元数据的原因并不是要弄乱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相同吗

如果是这样,这些不同以及在我的情况下应该使用哪一个?

2 个答案:

答案 0 :(得分:2)

不,他们不一样。

元数据类允许您为类成员定义/添加约束。

视图模型通常用于在视图中更轻松地使用模型。例如,为下拉列表提供SelectListItems列表,具有接受表单发布值的属性等等。

这两者通常结合使用,您在元数据类中添加验证,并通过视图模型强制执行。

在您的具体情况下,您似乎只需要一个元数据类。

答案 1 :(得分:2)

class ArticleMetadataclass Article的助手类,因为您无法将这些注释属性添加到特定属性中。 它们共同构成了MVC的模型部分。

请注意,部分类无法帮助处理属性,因为它无法重新定义属性。它仅用于链接MetaData类。

对于非常简单的操作(CRUD页面),您可以直接使用模型。在所有其他情况下,为每个View创建一个ViewModel。文章模型可能会由EditArticleViewModel使用。

通常,您应该创建ViewModel以支持Views,而不是每个Model的一个。一个ViewModel可以由来自多个Model类的数据组成。