使用Fluent验证进行不显眼的自定义/条件验证

时间:2012-06-08 19:00:51

标签: asp.net-mvc asp.net-mvc-3 unobtrusive-validation fluentvalidation

我正在寻找一种方法来为Fluent验证实施不显眼的自定义验证。根据{{​​3}},它似乎并不表示它支持不显眼的验证。

同样适用于使用条件验证(documentation)。我在他们的When/Unless中看到,通过条件验证和其他复杂验证不支持不引人注目的验证:

  

请注意,FluentValidation也适用于ASP.NET MVC的客户端验证,但并非所有规则都受支持。例如,使用条件(使用When / unless),自定义验证程序或对Must的调用定义的任何规则都不会在客户端运行。客户端支持以下验证器:

     

* NOTNULL / NotEmpty
  *匹配(正则表达式)
  * InclusiveBetween(范围)
  *信用卡式
  *电子邮件
  * EqualTo(跨财产平等比较)
  *长度

那么有没有人想出如何让它发挥作用?如果没有,是否有其他验证选项可以为不引人注目的自定义/复杂验证提供更好的支持?

1 个答案:

答案 0 :(得分:1)

通过关注Integration with ASP.NET MVC文档,我已成功将FluentValidation插入ASP.NET MVC 3。

简单的方法是将FluentValidation插入Global.asax Application_Start()中的MVC验证框架,如下所示:

FluentValidationModelValidatorProvider.Configure();

然后你可以用属性装饰你的POCO类,指定他们使用的验证器。

[Validator(typeof(PersonValidator))]
public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
}

在我的情况下,我不想这样做(使用属性),实际上需要针对不同的Validator验证相同的POCO类,具体取决于业务规则。

如果您想以这种方式选择不同的验证器,请按照“custom validator factory with an IoC container”上的文档进行操作。创建一个类FluentMvcValidatorFactory子类化ValidatorFactoryBase,它实现接口IValidatorFactory。自定义验证器工厂可以处理选择适当的验证器。

我试图让客户端验证工作(确实如此),但它似乎也插入了不显眼的验证。我的html输出如下:

<input type="text" value="" name="Email" id="Email" data-val-length-max="128" data-val-length="&amp;#39;Email&amp;#39; must be between 0 and 128 characters." data-val-email="&amp;#39;Email&amp;#39; is not a valid email address." data-val="true" class="text-box single-line">

只要你正确地将它插入MVC,我认为不引人注意应该有效。

在实践中,您不应完全依赖客户端或不显眼的验证,只能在输入期间使用它来帮助用户。最终服务器需要验证,但您可以让服务器端代码使用相同的FluentValidation验证器。