.net MVC、ViewModels和验证

.net MVC、ViewModels和验证,.net,asp.net-mvc-3,poco,ef4-code-only,.net,Asp.net Mvc 3,Poco,Ef4 Code Only,我正在使用POCOs使用EF4创建一个MVC3应用程序。我已经向EF实体添加了验证属性。现在,当我构建视图时,我想使用一个视图模型(也许可以使用来填充它们) 我遇到的问题是,我必须在视图模型上重新定义验证属性,这违反了DRY原则。例如,如果我决定更改字段的大小,我必须更改POCO和使用它的任何视图模型上的MaxLength属性 是否有一些技巧可以将验证规则从POCO映射到视图模型?我个人在视图模型上执行验证。这是控制器从视图接收的内容,它是包含用户输入的类。我区分了两种类型的验证规则:表面验证和

我正在使用POCOs使用EF4创建一个MVC3应用程序。我已经向EF实体添加了验证属性。现在,当我构建视图时,我想使用一个视图模型(也许可以使用来填充它们)

我遇到的问题是,我必须在视图模型上重新定义验证属性,这违反了DRY原则。例如,如果我决定更改字段的大小,我必须更改POCO和使用它的任何视图模型上的MaxLength属性


是否有一些技巧可以将验证规则从POCO映射到视图模型?

我个人在视图模型上执行验证。这是控制器从视图接收的内容,它是包含用户输入的类。我区分了两种类型的验证规则:表面验证和业务验证。诸如必填字段、正确格式之类的规则应该在视图模型中强制执行,而诸如具有给定名称的用户之类的业务规则应该在模型上验证


此外,可以将不同的视图模型映射到同一个模型,但根据视图验证规则可能会有所不同。因此,在视图模型上没有完全相同的验证规则

我也很难接受这一点,我同意这一点。我最近发布了一个关于这一点的问题,受到了相当大的回击

在任何实际应用中,你都无法获得完美的干燥效果。有时候,违反原则比盲目坚持原则更有好处

编辑:

也可以认为干能违背单责原则(SRP)。通过重用类似的代码,您现在可以让代码做不止一件事。如果您考虑到数据模型和视图模型有不同的目的,因此职责也不同这一事实。。。将它们组合成一个模型违反了SRP。也就是说,通过使数据模型也成为视图模型,这是两种不同的职责


现在,我们可以想出许多方法来尝试在这方面协调SRP和DRY,但在某些时候,您必须权衡成本带来的好处。

一种获得某种抽象的方法是让业务模型类“组合”成一个ViewModel,包括您需要的其他视图信息

class MyObject 
{
    public int ID {get;set}

    [Required]
    [StringLength(512)]     
    public string Name {get;set;}

}

class MyViewModel // ViewModel for a specific view 
{
    public MyObject MyModel {get;set;}        // the model that is being edited 

    // other data the view might need, set by the controller 
    public string SomeMessage { get; set; }
    public List<SomeObject> SomeObjects {get;set;} /// e.g. for a drop-down list

}
这样,您只需在一个位置指定业务类中的验证和/或数据注释


如果您想要进行不同的验证,则需要一些策略来选择性地应用验证逻辑。

感谢您的回复。我仍然希望有一些聪明的方法可以重用我的验证属性进行JQuery验证(我不太关心控制器中的验证,实体对象可以很好地实现),但现在我只需要重新实现我想要的属性。
@model My.Namespace.MyViewModel


Hello @model.MyModel.Name !!!