asp.net-mvc-3 – 使用FluentValidation / MVC 3验证客户端上的复选框

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – 使用FluentValidation / MVC 3验证客户端上的复选框前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试验证如果使用FluentValidation在客户端上检查一个复选框.我无法理解我的生活.

可以使用不显眼的验证来完成吗?

解决方法

我们假设你有以下模型:
  1. [Validator(typeof(MyviewmodelValidator))]
  2. public class Myviewmodel
  3. {
  4. public bool IsChecked { get; set; }
  5. }

与以下验证器:

  1. public class MyviewmodelValidator : AbstractValidator<Myviewmodel>
  2. {
  3. public MyviewmodelValidator()
  4. {
  5. RuleFor(x => x.IsChecked).Equal(true).WithMessage("Please check this checkBox");
  6. }
  7. }

和控制器:

  1. public class HomeController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. return View();
  6. }
  7.  
  8. [HttpPost]
  9. public ActionResult Index(Myviewmodel model)
  10. {
  11. return View(model);
  12. }
  13. }

具有相应的看法:

  1. @model Myviewmodel
  2. @using (Html.BeginForm())
  3. {
  4. @Html.LabelFor(x => x.IsChecked)
  5. @Html.CheckBoxFor(x => x.IsChecked)
  6. @Html.ValidationMessageFor(x => x.IsChecked)
  7. <button type="submit">OK</button>
  8. }

在Global.asax中,您已经注册了流畅的验证模型验证器提供程序:

  1. FluentValidationModelValidatorProvider.Configure();

到目前为止,我们的服务器端验证正常运行.那很好.这总是我们必须设置的第一部分.我已经看到人们太多地关注客户端验证,他们忘记了服务器端的验证,当你禁用javascript(或者甚至如果你用恶意的用户绊倒的话),那么糟糕的事情就会发生.
到目前为止,我们有信心,因为我们知道,即使在客户端弄坏了某些东西,我们的域也受到服务器端验证的保护.

所以现在我们来看看客户端的验证.开箱即用FluentValidation.NET支持EqualTo验证器的自动客户端验证,但与另一个等价于[比较]数据注释的属性值进行比较时.

但在我们的例子中,我们正在比较一个固定值.所以我们没有得到客户端的vaildation开箱即用.当我们没有开箱即用时,我们需要把它放在盒子里.

所以我们首先定义一个自定义FluentValidationPropertyValidator:

  1. public class EqualToValueFluentValidationPropertyValidator : FluentValidationPropertyValidator
  2. {
  3. public EqualToValueFluentValidationPropertyValidator(ModelMetadata Metadata,ControllerContext controllerContext,PropertyRule rule,IPropertyValidator validator)
  4. : base(Metadata,controllerContext,rule,validator)
  5. {
  6. }
  7.  
  8. public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
  9. {
  10. if (!this.ShouldGenerateClientSideRules())
  11. {
  12. yield break;
  13. }
  14. var validator = (EqualValidator)Validator;
  15.  
  16. var errorMessage = new MessageFormatter()
  17. .AppendPropertyName(Rule.GetDisplayName())
  18. .AppendArgument("ValueToCompare",validator.ValueToCompare)
  19. .BuildMessage(validator.ErrorMessageSource.GetString());
  20.  
  21. var rule = new ModelClientValidationRule();
  22. rule.ErrorMessage = errorMessage;
  23. rule.ValidationType = "equaltovalue";
  24. rule.ValidationParameters["valuetocompare"] = validator.ValueToCompare;
  25. yield return rule;
  26. }
  27. }

我们将在Application_Start中注册

  1. FluentValidationModelValidatorProvider.Configure(provider =>
  2. {
  3. provider.AddImplicitrequiredValidator = false;
  4. provider.Add(typeof(EqualValidator),(Metadata,context,description,validator) => new EqualToValueFluentValidationPropertyValidator(Metadata,validator));
  5. });

到目前为止,我们已将自定义FluentValidationPropertyValidator与EqualValidator相关联.

最后一部分是写一个自定义适配器:

  1. (function ($) {
  2. $.validator.unobtrusive.adapters.add('equaltovalue',['valuetocompare'],function (options) {
  3. options.rules['equaltovalue'] = options.params;
  4. if (options.message != null) {
  5. options.messages['equaltovalue'] = options.message;
  6. }
  7. });
  8.  
  9. $.validator.addMethod('equaltovalue',function (value,element,params) {
  10. if ($(element).is(':checkBox')) {
  11. if ($(element).is(':checked')) {
  12. return value.toLowerCase() === 'true';
  13. } else {
  14. return value.toLowerCase() === 'false';
  15. }
  16. }
  17. return params.valuetocompare.toLowerCase() === value.toLowerCase();
  18. });
  19. })(jQuery);

这几乎是这样的.剩下的就是包括客户端脚本:

  1. <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
  2. <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
  3. <script src="@Url.Content("~/Scripts/customadapter.js")" type="text/javascript"></script>

猜你在找的asp.Net相关文章