数据注释应该在模型还是视图模型上?

时间:2010-12-15 16:13:49

标签: asp.net asp.net-mvc asp.net-mvc-3

我习惯于使用数据注释属性来装饰数据模型类,但是我的纯粹主义者在这里略微包含纯粹的表现属性,例如显示格式。但是,我很高兴在这里保留以验证为中心的属性。我必须继续在数据模型中保留所有注释等的一个很好的理由是我的视图模型聚合数据模型类,例如视图模型中的ViewModelBase.DetailItem<TEntity>属性只是对数据模型中实体类的引用。如果我想将表示注释移动到视图模型,我必须彻底修改我的设计,在我的视图模型中复制数据模型属性,并使用对象映射工具根据数据模型对象填充视图模型对象。

我应该在哪里进行数据注释?

顺便说一句,这就是我的草稿ViewModelBase的样子:

public class ViewModelBase<T>
{
    public virtual string PageTitle { get; set; }
    public virtual string ViewHeading { get; set; }

    public virtual ViewMode ViewMode { get; set; }
    public virtual IEnumerable<T> ItemList { get; set; }
    public virtual T DetailItem { get; set; }
}

2 个答案:

答案 0 :(得分:12)

至少应在视图模型上执行验证,因为这是您从视图中获得的。此外,验证始终在给定视图的上下文中执行。因此,您可以有两个不同的视图模型对应于两个不同的视图但映射到单个模型类,并且因为验证可能因视图而异,所以应该在视图模型上执行此验证。如果您在模型上执行了验证,那么您将很难区分这两种情况,因为您可能会遇到第一个视图中需要属性但第二个视图不需要的情况。因此,如果您使用数据注释来执行验证,那么您应该使用它们来装饰视图模型。

答案 1 :(得分:7)

我对DRY主体和验证有同样的担忧,这就是为什么我更喜欢在模型中保留大多数验证要求。但为什么它必须是一个或另一个?模型验证属于模型,但是某些视图特定的验证属于视图模型。

话虽这么说,数据注释只是:围绕数据的注释。不正确的验证逻辑。验证逻辑是与数据注释完全不同的概念(必需属性仅仅是验证的一个方面)。我个人发现很难将真正的验证放在MVVM实现中,因为某些验证需要上下文而不仅仅是需要或不需要。

简短回答:如果它在您的模型中,那么它会聚合到您的视图模型中。如果存在视图特定要求,则视图模型可以在需要时满足其他要求。