jquery.validation.unobtrusive添加自
jquery.validation.unobtrusive.js是微软ASP.NET Core MVC(以及ASP.NET MVC)自带的快速使用jquery.validation的js框架,配合ASP.NET客户端语法,使用更加方便。
我的页面上有两个select,如果TypeId选择了第一个选项(value=1),则PartnerId可以选择任何选项,否则PartnerId必须选择第一个选项之外的选项。
<select asp-for="TypeId" asp-items="ViewBag.UserTypeList" class="form-control"></select>
<select asp-for="PartnerId" asp-items="ViewBag.PartnerList" class="form-control"></select>
<span asp-validation-for="PartnerId" class="text-danger"></span>
显然这个验证规则只能使用自定义验证规则来实现。
在项目中创建一个validator-additional-method.js文件,先编写jquery.validation的addMethod方法添加自定义验证规则:
$.validator.addMethod('partner', function (value, element, params) {
if ($('#TypeId').val() == 1) {
return true;
}
return value != 0;
});
我把这个验证规则称为partner,因此addMethod方法的第一个参数是'partner',第二个参数是验证规则的回调函数,在这个函数中,我们判断$('TypeId')的值,当它为1时,返回true,表示名为TypeId的select选择value=1的选项时,验证无条件通过。回调函数的第一个参数value是我们要验证的控件的值,这里就是PartnerId的值,因为当TypeId不为1时,PartnerId不能是第一个选项(value=0),因此函数返回value!=0,做为验证结果。
接下来添加jquery.validation.unobtrusive适配器:
$.validator.unobtrusive.adapters.add('partner', function (options) {
options.rules["partner"] = { };
options.messages["partner"] = options.message;
});
方法的第一个参数是验证规则名称,必须前面addMethod方法的第一个参数相同,第二个是回调函数,用来传递自定义验证规则的相关数据,实际上,当页面加载上,这个方法的回调函数会被首先执行,以获取自定义验证规则的必要信息。
最后为控件添加jquery.validation.unobtrusive的验证规则data-val-partner="需要指定合伙人"
<select asp-for="PartnerId" data-val="true" data-val-partner="需要指定合伙人" asp-items="ViewBag.PartnerList" class="form-control"></select>
<span asp-validation-for="PartnerId" class="text-danger"></span>
在addMethod方法中,我们使用硬编码来判定TypeId的值,显然不合适,可以把select的id做为参数传递给自定义验证函数。
修改jquery.validation.unobtrusive适配器方法:
$.validator.unobtrusive.adapters.add('partner', ['args'], function (options) {
options.rules["partner"] = {
args: options.params.args
};
options.messages["partner"] = options.message;
});
添加了第二个参数:['args'],并且在函数中把它传递给了验证对象。
把addMethod方法修改为:
$.validator.addMethod('partner', function (value, element, params) {
if ($(params.args).val() == 1) {
return true;
}
return value != 0;
});
注意参数的名称要和jquery.validation.unobtrusive适配器方法中的名称一致。
在要验证的控件中添加参数data-val-partner-args="#TypeId"
:
<select data-val="true" asp-for="PartnerId" data-val="true" data-val-partner="需要指定合伙人" data-val-partner-args="#TypeId" asp-items="ViewBag.PartnerList" class="form-control"></select>
<span asp-validation-for="PartnerId" class="text-danger"></span>