2012-09-21 125 views
0

我一直在努力重构我现在正在做的模型验证。我的应用程序都是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的错误样式仍然有效。

回答

0

你真的在寻找FluentValidation

但是,我不知道它是否支持MVC2。但它确实支持MVC3和MVC4。从它的网站

示例代码:

public class CustomerValidator: AbstractValidator<Customer> { 
    public CustomerValidator() { 
    RuleFor(customer => customer.Surname).NotEmpty(); 
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name"); 
    RuleFor(customer => customer.Company).NotNull(); 
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount); 
    RuleFor(customer => customer.Address).Length(20, 250); 
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode"); 
    } 

    private bool BeAValidPostcode(string postcode) { 
    // custom postcode validating logic goes here 
    } 
}