自定义验证客户端忽略无效状态

时间:2014-01-31 13:02:24

标签: c# asp.net validation webforms

我想制作自定义验证器,用于检查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" />

1 个答案:

答案 0 :(得分:0)

我相信你会进入无限循环,因为当你知道页面处于无效状态时,你会尝试验证页面。

Page_ClientValidate()将依次调用每个验证器以确保它们已被触发,当它到达您的自定义验证器时,您再次将它踢掉,这将导致您看到的递归。 更好的选择是检查Page_IsValid的值,而不是由其他验证器保持最新。

最后,不要忘记如果文本框为空,则不会调用验证器,您也需要在那里有一个必需的字段验证器。

更多详情可在MSDN article: ASP.Net Validation In Depth找到。