【发布时间】:2014-10-25 19:33:16
【问题描述】:
所以我们使用 DataAnnotations 来实现我们的 ASP.NET MVC 表单的输入验证。如果我们要重新开始,我会考虑使用 Fluent Validation,但我们现在距离太远,无法做出改变。
所以这个项目需要我们构建很多表单。随着我们的进步,我们已经确定了跨表单重复的输入组。这方面的一个例子可能是一组表示地址的输入。
然后,我们通过为其创建 _AddressEntry 部分视图以及关联的视图模型 - AddressViewModel,将地址输入转换为可重用模块。父窗体的视图模型如下所示:
public class SubmitEnquiryViewModel
{
public AddressViewModel Address { get; set; }
public string Enquiry { get; set; }
...
}
在_SubmitEnquiry 视图中,然后我们使用EditorFor() 插入_AddressEntry 部分视图。
在我们意识到地址输入的不同实例具有不同的验证要求之前,这可以正常工作 - 装饰 AddressViewModel 的验证属性并不总是适用。为了解决这个问题,我们定义了一个IAddressViewModel:
public interface IAddressViewModel
{
string LineOne { get; set; }
string LineTwo { get; set; }
...
}
然后为验证规范的所有不同排列定义此接口的具体实现 - 例如AddressViewModel(默认验证)、AddressNoValidationViewModel 等
然后将_AddressEntry 部分视图绑定到IAddressViewModel,并为父视图模型的 Address 属性选择适当的具体实现。
这种方法的主要缺点是我们最终可能会得到很多视图模型,它们的区别仅在于应用于它们的验证属性。这被认为是可以接受的,因为可重用模块的数量预计会相对较少。
以前有没有其他人遇到过这个挑战?你想出了什么解决方案?您对上述解决方案有何看法?
【问题讨论】:
-
你的验证做得怎么样?
-
使用 OOTB
DataAnnotations验证属性并让DefaultModelBinder做它的事情(因此DataAnnotationsModelValidator我猜)。
标签: asp.net-mvc asp.net-mvc-4 validation viewmodel