Asp.net mvc 使用流畅的验证进行不引人注目的自定义/条件验证

Asp.net mvc 使用流畅的验证进行不引人注目的自定义/条件验证,asp.net-mvc,asp.net-mvc-3,unobtrusive-validation,fluentvalidation,Asp.net Mvc,Asp.net Mvc 3,Unobtrusive Validation,Fluentvalidation,我正在寻找一种方法来实现流畅的自定义验证。根据,它似乎并不表示它支持不引人注目的验证 这同样适用于使用条件验证()。我从他们的例子中看到,条件验证和其他复杂验证不支持不引人注目的验证: 请注意,FluentValidation还可以与ASP.NET MVC的客户端验证一起使用,但并非所有规则都受支持。例如,使用条件(带有When/除非)、自定义验证器或对Must的调用定义的任何规则都不会在客户端运行。客户端上支持以下验证器: *NotNull/NotEmpty *匹配项(正则表达式) *包括两种

我正在寻找一种方法来实现流畅的自定义验证。根据,它似乎并不表示它支持不引人注目的验证

这同样适用于使用条件验证()。我从他们的例子中看到,条件验证和其他复杂验证不支持不引人注目的验证:

请注意,FluentValidation还可以与ASP.NET MVC的客户端验证一起使用,但并非所有规则都受支持。例如,使用条件(带有When/除非)、自定义验证器或对Must的调用定义的任何规则都不会在客户端运行。客户端上支持以下验证器:

*NotNull/NotEmpty
*匹配项(正则表达式)
*包括两种(范围)
*信用卡
*电子邮件
*相等(跨属性相等比较)
*长度


有人想出办法让它工作了吗?如果没有,是否有其他验证选项可以更好地支持不引人注目的自定义/复杂验证?

我已经按照文档成功地将FluentValidation插入ASP.NET MVC 3

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

FluentValidationModelValidatorProvider.Configure();
<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">
然后,您可以使用属性修饰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; }
}
在我的例子中,我不想这样做(使用属性),实际上需要根据业务规则针对不同的验证器验证相同的POCO类

如果您希望以这种方式选择不同的验证器,请按照“”上的文档进行操作。创建一个类FluentMvcValidatorFactory子类ValidatorFactoryBase,它实现了接口IValidatorFactory。自定义验证器工厂可以处理选择正确验证器的问题

我试图让客户端验证正常工作(确实如此),但它似乎也插入了不引人注目的验证。我的html输出如下所示:

FluentValidationModelValidatorProvider.Configure();
<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验证器

您能否提供一个具体的例子,说明您试图实现/验证的目标?你的具体场景是什么?好吧,仅仅使用When/除非方法并不能悄悄地工作,不管怎样,都是开箱即用的。即使我能找到解决这些问题的办法,这也会让我更进一步。很有可能,如果它能像When/uncept那样使用条件,那么它也能使用自定义验证。谢谢你的帖子。事实上,我的标准验证工作起来很低调,问题在于何时/除非条件验证开始工作,或者自定义验证(我在这里创建自己的验证规则)。我明白了-所以您想使用FluentValidation定义自定义验证规则(条件),并将这些规则转换为用于客户端验证的自定义jquery.unobtrusive.validation规则?这是不受支持的。因此需要一个自定义代码来弥补这一差距。在客户端而不是服务器端拥有自定义规则有多重要?也许这太过分了。使用FluentValidation的部分原因是,在客户端和服务器上编写更少的代码-相同的验证规则。我同意。但在许多情况下,只有在某些情况下才需要验证某些字段(即,如果未选中“与账单相同”复选框,则需要装运地址字段)。对我来说,这似乎是一个常见的需求,正如您所说,我不想为此编写单独的验证,因为不引人注目的验证不适用于这些When/除非条件。