2012-04-18 63 views
3

我有一個簡單的方法:如果勾選'yes'單選按鈕比使文本框處於必需狀態。我提供了客戶端和服務器端驗證。我發現的是:CustomValidator在客戶端觸發,但驗證失敗時驗證控件不呈現

  1. 客戶端驗證通過警報消息觸發並正確顯示故障。
  2. 驗證控件從不呈現錯誤消息,並且服務器被擊中。
  3. 當服務器被擊中且驗證失敗時,控件呈現正確的錯誤消息。

爲什麼客戶端在驗證方面工作正常,但不會呈現錯誤消息並繼續到服務器?

asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> 
<script src="Scripts/jquery-1.7.2.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    function testClientValidation(src, args) { 
     if ($('#<%=rblstTest.ClientID%>' + ' input:checked').length == 1) { 
      if ($('#<%=rblstTest.ClientID%>' + ' input:checked').val().toLowerCase() == "yes") { 
       args.isValid = !($('#<%=txtTest.ClientID%>').val() == ""); 
      } else { 
       args.isValid = true; 
      } 
     } else { 
      args.isValid = true; 
     } 

     alert(args.isValid); 
    } 
</script> 
</asp:Content> 
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
<div> 
<asp:RadioButtonList ID="rblstTest" RepeatDirection="Horizontal" RepeatLayout="Flow" runat="server"> 
    <asp:ListItem>Yes</asp:ListItem> 
    <asp:ListItem>No</asp:ListItem> 
</asp:RadioButtonList> 

<asp:TextBox ID="txtTest" runat="server"/> 

<asp:CustomValidator ID="cust" ControlToValidate="rblstTest" 
           OnServerValidate="testSeverValidation" 
           ClientValidationFunction="testClientValidation" 
           Display="Dynamic" 
           ErrorMessage="Error!" runat="server"/> 

<asp:LinkButton runat="server" ID="lnkSubmit" Text="Submit" /> 
</div> 
</asp:Content> 
+0

被接受的答案是沒有作用的,未來的使用者檢查。原因是,客戶端代碼正在通過單擊「是」或「否」將用戶發送到服務器(代碼隱藏)。但事實並非如此。如果頁面在客戶端正確驗證,用戶應該移動到代碼後面。你被要求再次進行審查 – Pankaj 2012-04-19 15:53:39

+0

@Guest問題,據我所知,這個問題是,即使客戶端驗證失敗,錯誤不會顯示,回發完成。這是因爲值true或false被設置爲args參數的錯誤成員。一旦設置爲糾正一個'IsValid',並且如果該值爲假,則停止向服務器提交頁面並顯示錯誤 – Ramesh 2012-04-20 00:46:06

+0

在OP中,它總是重定向到服務器。驗證與否 – Pankaj 2012-04-20 05:11:46

回答

4

使用args.IsValid而不是args.isValid

function testClientValidation(src, args) { 
     if ($('#<%=rblstTest.ClientID%>' + ' input:checked').length == 1) { 
      if ($('#<%=rblstTest.ClientID%>' + ' input:checked').val().toLowerCase() == "yes") { 
       args.IsValid = !($('#<%=txtTest.ClientID%>').val() == ""); 
      } else { 
       args.IsValid = true; 
      } 
     } else { 
      args.IsValid = true; 
     } 

     alert(args.IsValid); 
    } 
+0

啊,太簡單了 - 感謝您的幫助。 – Mike 2012-04-19 14:25:02

+0

@Beavis - 我檢查了這段代碼併發布了原始代碼。爲什麼它應該通過單擊「是」或「否」按鈕將用戶發送到服務器?一旦首先在客戶端完成了「驗證」檢查,它是否應該到達'後面的代碼? – Pankaj 2012-04-19 18:52:53

0

我加了一個Hidden Field新添加。

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> 
<script type="text/javascript" language="javascript" src="Scripts/jquery-1.4.1.min.js"></script> 
<script type="text/javascript" language="javascript" src="Scripts/jquery-1.4.1.js"></script> 
<script language="javascript" type="text/javascript"> 

    function testClientValidation(src, args) { 
     debugger; 
     if (document.getElementById('<%= hdn.ClientID %>').value == '1') { 
      var txtBox = document.getElementById('<%= txtTest.ClientID%>'); 
      if (txtBox.value == '') { 
       document.getElementById('cust').style.display = 'block'; 
       document.getElementById('cust').innerHTML = 'Error!' 
       document.getElementById('<%= hdn.ClientID %>').value = "1"; 
       args.IsValid = false; 
       return false; 
      } 
      else { 
       document.getElementById('cust').style.display = 'none'; 
       document.getElementById('cust').innerHTML = ''; 
       document.getElementById('<%= hdn.ClientID %>').value = "0"; 
       args.IsValid = true; 
      } 
     } 
     else { 
      document.getElementById('cust').style.display = 'none'; 
      document.getElementById('cust').innerHTML = ''; 
      document.getElementById('<%= hdn.ClientID %>').value = "0"; 
      args.IsValid = true; 
     } 
     return true; 
    } 


    $(document).ready(function() { 
     $("span input[type='radio']").click(function() { 
      debugger; 
      if ($(this).val() == 'Yes') { 
       document.getElementById('<%= hdn.ClientID %>').value = "1"; 
       if (document.getElementById('<%= txtTest.ClientID%>').value == '') { 
        Page_IsValid = false; 
        document.getElementById('<%= hdn.ClientID %>').value = "1"; 
       } 
       else { 
        Page_IsValid = true; 
       } 
      } 
      else { 
       document.getElementById('<%= hdn.ClientID %>').value = "0"; 
       Page_IsValid = true; 
      } 
      return true; 
     }); 
    }); 
</script> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <div> 
     <asp:RadioButtonList ID="rblstTest" RepeatDirection="Horizontal" RepeatLayout="Flow" 
      runat="server"> 
      <asp:ListItem>Yes</asp:ListItem> 
      <asp:ListItem>No</asp:ListItem> 
     </asp:RadioButtonList> 
     <asp:TextBox ID="txtTest" runat="server" /> 
     <asp:CustomValidator ClientIDMode="Static" ID="cust" OnServerValidate="testSeverValidation" 
      ClientValidationFunction="testClientValidation" Display="Dynamic" ErrorMessage="Error!" 
      runat="server" /> 
     <asp:LinkButton runat="server" ID="lnkSubmit" Text="Submit" /> 
     <asp:HiddenField ID="hdn" runat="server" Value="0" /> 
    </div> 
</asp:Content> 

欲瞭解更多信息,請從參考here enter image description hereenter image description here

+0

感謝您的答案,但這並不適合我。 – Mike 2012-04-18 18:29:55

+0

@Beavis請馬上檢查。 – Pankaj 2012-04-18 23:14:00

+0

在看你的代碼。以下是一些評論。 a)您不需要設置驗證器的顯示。正如放置在您的參考部分的ValidatorValidate方法那樣。 b)您的客戶端驗證功能不需要返回true/false。 c)你不應該從你的代碼中操縱Page_IsValid。它將由ValidatorValidate和其他框架代碼進行處理。 d)沒有理由的很多代碼。 – Ramesh 2012-04-20 06:21:06