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