2014-01-31 31 views
1

我想制作自定义验证器,用于检查给定名称的对象是否已经存在于数据库中。 WS工作正常,arg.IsValid设置为假但是 当我取消注释Page_ClientValidate();函数进入无限循环(我猜它运行所有验证函数,为什么)但它返回false但当页面submited时,验证器开始返回true 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

我相信你会进入无限循环,因为你想,当你知道这是在验证页面无效状态。

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

最后,不要忘记,如果文本框为空,验证程序将不会被调用,您还需要在此处具有必需的字段验证程序。

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