【发布时间】:2015-04-28 07:24:06
【问题描述】:
我在我的 Asp.Net MVC 4 应用程序中使用 FluentValidation。我已经知道有些规则会自动为 jQuery 验证库生成属性。而且这个脚本库已经知道它必须检查什么,例如data-rule-required、data-rule-range等等。
我知道 FluentValidation 中有一些功能,但这些功能不包括在客户端。例如:.Equal(true)。
我已经检查了@DarinDimitrov 答案here 并没有任何问题地实现了这个。
但是,我不想总是创建从FluentValidationPropertyValidator 继承的新类。我们必须像在 global.asax 中那样将它添加到提供者:
provider.Add(typeof(EqualValidator), (metadata, context, description, validator) => new EqualToValueClientRule(metadata, context, description, validator));
在这种情况下,EqualValidator 已经在 FluentValidation 中实现。但是,如果我们创建了一个带有 When 关键字的验证器呢?例如,我有:
this.RuleFor(phone => phone.Digits)
.Length(7)
.When(phone => phone.PrefixId == 2)
.WithMessage("Numbers in 2nd city must contain 7 characters");
this.RuleFor(phone => phone.Digits)
.Length(7)
.When(phone => phone.PrefixId > 64)
.WithMessage("Mobile number must contain 7 characters");
this.RuleFor(phone => phone.Digits)
.Length(5)
.When(phone => phone.PrefixId != 2)
.WithMessage("Numbers in other cities must contain 5 characters")
当然,我可以使用 jQuery/JavaScript 毫无问题地进行检查。但是,这种方法并不好。在其他情况下,您必须编写大量代码以在客户端生成自定义属性并向适配器添加新功能。或者,只使用 jQuery/JavaScript?还是别的什么?也许我们可以将 JavaScript 函数名称添加到 FluentValidationPropertyValidator?
你有什么推荐给我的?
【问题讨论】:
-
我想最好的方法是创建 PropertyValidator 类,它在服务器端始终有效,注册 javascript 函数名称,将在客户端执行。
-
@EvgenyLevin 我已经做到了。另外,我的验证器也实现了
IClientValidatable。它将在客户端创建验证属性。因此,我可以在任何其他项目中轻松使用此验证器。 -
是的,您的验证器可以作为电话验证器重复使用,但我的想法是创建“假”验证器,它只在特殊属性和适配器中注册客户端函数,调用该 js 函数,以及与规则构建器链一起使用的扩展。然后调用将如下所示:
RuleFor(phone => phone.Digits).Length(7).When(...).WithMessage("...").Length(5).When(...).WithMessage("...").ClientSideRule("allPhoneValidationLogicWithWhenConditionsFunction"); -
@EvgenyLevin 我明白了。但是,我将在哪里创建客户端属性?
标签: c# asp.net-mvc asp.net-mvc-4 unobtrusive-validation fluentvalidation