我想制作自定义验证器,用于检查DB中是否已存在给定名称的对象。
WS工作正常,arg.IsValid
设置为false但是
当我取消注释Page_ClientValidate();
函数进入无限循环(我猜它运行所有验证函数,为什么)然而它返回false但是当页面被提交时,验证器开始返回真正的O.o'。
如果txtname
无效,如何中止回发?
我怀疑它是因为当我按下按钮smsCodeValidator
实际上是运行但由于回发而中止
<asp:CustomValidator
ID="cvtxtSMSCode"
runat="server" Display="Dynamic"
ControlToValidate="txtName"
EnableClientScript="true"
ClientValidationFunction="$U.nameValidator"
ForeColor="Red"
ErrorMessage="already exists"
ValidationGroup="vgName">
</asp:CustomValidator>
nameValidator: function (source, arg) {
$.ajax({
type: "POST",
url: "/../../../../WS/Utility.asmx/NameValidator",
data: JSON.stringify({ "toTest": arg.Value }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
if (result.d == true) {
arg.IsValid = true;
$(source).hide();
return;
}
else {
$(source).show();
arg.IsValid = false;
alert(arg.IsValid);
//Page_ClientValidate();
return;
}
}
});
},
<asp:Button ID="btnSave" ValidationGroup="vgName"
runat="server"
OnClick="btnSaveChanges_Click"
Text="Save" />
答案 0 :(得分:0)
我相信你会进入无限循环,因为当你知道页面处于无效状态时,你会尝试验证页面。
Page_ClientValidate()
将依次调用每个验证器以确保它们已被触发,当它到达您的自定义验证器时,您再次将它踢掉,这将导致您看到的递归。
更好的选择是检查Page_IsValid
的值,而不是由其他验证器保持最新。
最后,不要忘记如果文本框为空,则不会调用验证器,您也需要在那里有一个必需的字段验证器。