.NET Core升级后jQuery Validation无法识别自定义验证属性的问题
.NET Core升级后jQuery Validation无法识别自定义验证属性的问题
我之前升级.NET Core的时候也踩过这个一模一样的坑!你已经搞定了后端data属性的渲染,这步已经过了最挠头的一关,接下来就是让jQuery Unobtrusive Validation能“读懂”你的自定义验证规则就行,给你一步步拆解:
首先得确保后端的自定义验证属性正确实现了客户端验证接口:
你的AcceptedTermsAndConditionsAttribute得继承IClientModelValidator,并且在AddValidation方法里把验证标识配置对,比如:
public class AcceptedTermsAndConditionsAttribute : ValidationAttribute, IClientModelValidator { public override bool IsValid(object value) { // 这里写核心验证逻辑,比如判断用户是否勾选了条款复选框 return value is bool isAccepted && isAccepted; } public void AddValidation(ClientModelValidationContext context) { // 开启客户端验证标记 context.Attributes.Add("data-val", "true"); // 设置自定义错误提示,对应前端的data-val-acceptedtermsandconditions context.Attributes.Add("data-val-acceptedtermsandconditions", ErrorMessage ?? "请务必接受条款和条件"); // 关键:设置验证类型标识,要和前端适配器名称完全匹配 context.Attributes.Add("data-val-acceptedtermsandconditions-type", "acceptedtermsandconditions"); } }
然后是前端的核心操作——给Unobtrusive注册适配规则,因为jQuery Validation默认根本不知道你的自定义规则,得手动告诉它怎么把data属性转成验证逻辑:
首先注意脚本引入顺序,必须是这个顺序:
- jQuery
jquery.validate.jsjquery.validate.unobtrusive.js- 你的自定义适配脚本
然后在适配脚本里加这段代码:
// 因为你的验证是布尔型(勾选/不勾选),用addBool最省事 $.validator.unobtrusive.adapters.addBool('acceptedtermsandconditions'); // 如果你的自定义验证需要传参数,就用add方法配合验证方法,比如: // $.validator.unobtrusive.adapters.add('acceptedtermsandconditions', ['paramName'], function (options) { // options.rules['acceptedtermsandconditions'] = options.params; // options.messages['acceptedtermsandconditions'] = options.message; // }); // 还要给jQuery Validation加对应的验证方法: // $.validator.addMethod('acceptedtermsandconditions', function (value, element, params) { // // 这里写前端验证逻辑 // return value === true || value === 'true'; // }, '');
最后再给你提几个容易踩的小坑:
- 后端设置的验证类型名称和前端适配器的名称必须完全一致,大小写也不能错!比如后端用全小写的
acceptedtermsandconditions,前端就不能写成驼峰式 - 确认.NET Core项目启用了客户端验证,在Startup.cs里配置:
services.AddControllersWithViews() .AddMvcOptions(options => { options.ClientValidationEnabled = true; });
- 检查你的输入标记,确保
data-val="true"和data-val-acceptedtermsandconditions都正确渲染,就像你提供的示例:
<input class="control--input valid" data-val="true" data-val-acceptedtermsandconditions="请接受条款和条件" />
按这些步骤走下来,jQuery Unobtrusive应该就能正确识别你的自定义验证了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

