我在创建自定义不显眼的验证方面相当新,并且遇到了一个奇怪的问题。
此验证基本上只检查数据库(通过Ajax)以查看模型和序列号组合是否已存在。 jQuery和Ajax似乎按预期运行,但是一旦我的验证函数被调用,我的验证消息就会出现。
这是我的jQuery:
$.validator.addMethod('newserialandmodel',
function (value, element, parameters) {
var modelNumber = $('#ProductInformation_ModelNumber').val();
var serialNumber = value;
var token = $('input[name=__RequestVerificationToken]').val();
$.ajax({
type: "POST",
url: "/ajax/getmodelandserialexists/",
data: ({
modelNumber: modelNumber,
serialNumber: serialNumber,
'__RequestVerificationToken': token
}),
cache: true,
dataType: 'json',
success: function (response) {
if (response.exists) {
$.validator.messages.newserialandmodel =
$.format($.validator.messages.newserialandmodel);
}
return !response.exists;
}
});
return false;
}
);
$.validator.unobtrusive.adapters.add(
'newserialandmodel',
function (options) {
options.rules['newserialandmodel'] = options.params;
if (options.message != null) {
$.validator.messages.newserialandmodel = options.message;
}
}
);
这是表单元素的样子:
<input type="text" value=""
name="ProductInformation.SerialNumber" id="ProductInformation_SerialNumber"
data-val-required="The Serial number field is required."
data-val-newserialandmodel="There is already a contract with the provided model and serial numbers."
data-val-length-max="30"
data-val-length="The 30 field requires no more than 30 characters."
data-val="true" class="input-validation-error">
当我单步执行时,只要它到达验证的第一行,就会显示消息:
已经提供了所提供型号和序列号的合同。
此外,即使该函数返回true,它也会保留。
函数/ Ajax的其余部分工作得很好,我只是可以弄清楚为什么它会立即显示这条消息,以及当我返回true时为什么它会保留在那里。
知道发生了什么事吗?
答案 0 :(得分:1)
我认为这是因为你在函数结束时返回false
。因此该函数将返回false,然后success
回调触发尝试返回true
,但为时已晚并且false
已经返回到验证程序。一个简单的解决方案是使用async: false
同步进行AJAX调用。
答案 1 :(得分:1)
感谢Greg和Zero的回应,它让我更多地玩回报值。
问题是我的Ajax成功函数中的return
只是将响应返回给success函数,而不是验证函数。所以我不得不改变它以在Ajax成功函数中设置一个值,并返回它。
值得注意的是,我必须包含async: false
,否则验证函数将在Ajax调用完成之前返回(默认值为false
)。
$.validator.addMethod('newserialandmodel',
function (value, element, parameters) {
var modelNumber = $('#ProductInformation_ModelNumber').val();
var serialNumber = value;
var token = $('input[name=__RequestVerificationToken]').val();
var isValid = false;
$.ajax({
type: "POST",
url: "/ajax/getmodelandserialexists/",
data: ({
modelNumber: modelNumber,
serialNumber: serialNumber,
'__RequestVerificationToken': token }),
async: false,
dataType: 'json',
success: function (response) {
if (response.exists) {
$.validator.messages.newserialandmodel =
$.format($.validator.messages.newserialandmodel);
}
isValid = !response.exists;
}
});
return isValid;
}
);
答案 2 :(得分:0)
几个猜测:
您有“cache:true”,这意味着如果URL相同,它将无法从服务器获取。我不知道缓存是否检查POSTed参数,因此即使使用不同的参数,它也可能使用缓存版本。尝试将缓存设置为false。
我不熟悉适配器API,但以前的活动是否可能导致条件得到满足? (执行此选项时,选项实际上不为空)?