asp.net-mvc-3 – 使用FluentValidation / MVC 3验证客户端上的
我正在尝试验证如果使用FluentValidation在客户端上检查一个复选框.我无法理解我的生活.
可以使用不显眼的验证来完成吗? 解决方法
我们假设你有以下模型:
[Validator(typeof(MyViewModelValidator))] public class MyViewModel { public bool IsChecked { get; set; } } 与以下验证器: public class MyViewModelValidator : AbstractValidator<MyViewModel> { public MyViewModelValidator() { RuleFor(x => x.IsChecked).Equal(true).WithMessage("Please check this checkbox"); } } 和控制器: public class HomeController : Controller { public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 具有相应的看法: @model MyViewModel @using (Html.BeginForm()) { @Html.LabelFor(x => x.IsChecked) @Html.CheckBoxFor(x => x.IsChecked) @Html.ValidationMessageFor(x => x.IsChecked) <button type="submit">OK</button> } 在Global.asax中,您已经注册了流畅的验证模型验证器提供程序: FluentValidationModelValidatorProvider.Configure(); 到目前为止,我们的服务器端验证正常运行.那很好.这总是我们必须设置的第一部分.我已经看到人们太多地关注客户端验证,他们忘记了服务器端的验证,当你禁用javascript(或者甚至如果你用恶意的用户绊倒的话),那么糟糕的事情就会发生. 所以现在我们来看看客户端的验证.开箱即用FluentValidation.NET支持EqualTo验证器的自动客户端验证,但与另一个等价于[比较]数据注释的属性值进行比较时. 但在我们的例子中,我们正在比较一个固定值.所以我们没有得到客户端的vaildation开箱即用.当我们没有开箱即用时,我们需要把它放在盒子里. 所以我们首先定义一个自定义FluentValidationPropertyValidator: public class EqualToValueFluentValidationPropertyValidator : FluentValidationPropertyValidator { public EqualToValueFluentValidationPropertyValidator(ModelMetadata metadata,ControllerContext controllerContext,PropertyRule rule,IPropertyValidator validator) : base(metadata,controllerContext,rule,validator) { } public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() { if (!this.ShouldGenerateClientSideRules()) { yield break; } var validator = (EqualValidator)Validator; var errorMessage = new MessageFormatter() .AppendPropertyName(Rule.GetDisplayName()) .AppendArgument("ValueToCompare",validator.ValueToCompare) .BuildMessage(validator.ErrorMessageSource.GetString()); var rule = new ModelClientValidationRule(); rule.ErrorMessage = errorMessage; rule.ValidationType = "equaltovalue"; rule.ValidationParameters["valuetocompare"] = validator.ValueToCompare; yield return rule; } } 我们将在Application_Start中注册: FluentValidationModelValidatorProvider.Configure(provider => { provider.AddImplicitRequiredValidator = false; provider.Add(typeof(EqualValidator),(metadata,context,description,validator) => new EqualToValueFluentValidationPropertyValidator(metadata,validator)); }); 到目前为止,我们已将自定义FluentValidationPropertyValidator与EqualValidator相关联. 最后一部分是写一个自定义适配器: (function ($) { $.validator.unobtrusive.adapters.add('equaltovalue',['valuetocompare'],function (options) { options.rules['equaltovalue'] = options.params; if (options.message != null) { options.messages['equaltovalue'] = options.message; } }); $.validator.addMethod('equaltovalue',function (value,element,params) { if ($(element).is(':checkbox')) { if ($(element).is(':checked')) { return value.toLowerCase() === 'true'; } else { return value.toLowerCase() === 'false'; } } return params.valuetocompare.toLowerCase() === value.toLowerCase(); }); })(jQuery); 这几乎是这样的.剩下的就是包括客户端脚本: <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/customadapter.js")" type="text/javascript"></script> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – HttpHandler在IIS 7中不起作用
- WebApi ASP.NET身份Facebook登录
- asp.net – 没有回发的日历控件
- kendo-ui – Kendo DropDownList – 在optionLabel添加类
- asp.net-mvc-3 – ASP.Net MVC 3:在哪里处理会话丢失?
- asp.net-mvc-2 – 如何在asp.net mvc 2中使用fakeiteasy假冒
- ASP.NET MVC 5和Bootstrap 3
- asp.net-mvc-3 – 在开发和生产之间管理EF Code First迁移
- asp.net-mvc – 禁用为特定提交按钮启用不显眼的验证
- asp.net-mvc – Resharper 5:如何设置内联代码块的默认格式