我一直在努力重构我现在正在做的模型验证。我的应用程序都是ASP.NET MVC 2(.Net 3.5框架)。我已经阅读了这个主题的相关问题,它们与我所问的不完全一样。如何在ASP.NET MVC 2应用程序中执行复杂的模型验证?
目前,对于页面验证,我通常坚持使用if/else语句的大杂烩。问题是,如果字段A是特定值,则字段B有时会被验证,但是字段A也具有它自己的验证。在某些情况下,角色会发挥作用,这也可能会根据用户的角色(即,不验证具有角色x的用户无法修改的字段)来验证验证。
我的问题归结到这一点:
1)我如何处理在验证更容易阅读的方式?我查看了DataAnnotations,但它们还不够。数据注释处理字段值的验证,其中可能需要完成的验证取决于字段的值和对象上其他属性的值。
2)如何将验证框架与ASP.NET MVC 2集成?
我真的恨我怎么做我的验证的事情,现在是,当我添加了一个模型误差,我硬编码该属性的关键。这很糟糕。不过,我不知道如何获得所述属性的关键字,以便它匹配由html帮助程序创建的html字段。
例如,在我看来,我使用的是编辑模板,以显示我的客户对象的字段。
<%= Html.EditorFor(m => m.CustomerInfo) %>
生成的HTML的一部分的名字创建领域:
<input id="CustomerInfo_FirstName" name="CustomerInfo.FirstName" style="width:330px;" type="text" value="John" />
为了使框架仍然突出必要的CSS领域,我迫使该验证像这样:
//Ignore that this can be done with DataAnnotations. This is just a simple example.
if (String.IsnullOrEmpty(customerInfo.FirstName))
{
ModelState.AddModelError("CustomerInfo.FirstName",
"First Name is required.");
}
这就是我所看到的主要问题。我没有一个很好的方法来知道页面上的字段名称。它似乎采取的格局
<objectname>.<propertyname>
,但我真的想要更可靠的东西。
为了使这个对象的名字,我想我可以拉出来的ModelBindingContext类的,但我不知道如何从控制器的内部得到这方面的一个实例。对于属性名称,我可以使用一些lambda,它将以字符串的形式返回属性的名称。总结一下,我正在寻找:1)某种验证框架,允许进行复杂的验证2)某种方式来识别在ModelState.AddModelError方法中使用的密钥,以便MVC的错误样式仍然有效。