2012-04-18 6 views
3

私はシンプルです:「はい」ラジオボタンがチェックされている場合は、クライアント側とサーバー側の両方の検証を提供しました。私が見つけたのは: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

の受け入れられて答えが全く将来のユーザーのために有用ではありませんからご確認ください。 。理由は、クライアント側のコードは、はい(Yes)またはいいえ(No)をクリックすると、サーバー(Code Behind)にユーザーを送ります。ページがクライアント側で正しく検証された場合は、コードの背後に移動する必要があります。 – Pankaj

+0

@Guest質問からわかるように、クライアントの検証に失敗してもエラーは表示されず、ポストバックが行われます。これは、trueまたはfalseの値がargsパラメーターの間違ったメンバーに設定されているためです。 1つの 'IsValid'を修正するように設定され、値がfalseの場合、サーバーへのページの送信が停止され、エラーが表示されます。 – Ramesh

+0

OPの場合、常にサーバーにリダイレクトされます。検証済みかどうか – Pankaj

答えて

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

+0

@Beavis - 私はこのコードをチェックし、オリジナルのコードを投稿しました。はいまたはいいえボタンをクリックしてサーバーにユーザーを送信する理由は何ですか?最初に '検証 'チェックが'クライアント側'で完了したら、 '暗証番号'に到達してはいけませんか? – Pankaj

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

+0

@Beavisご確認ください。 – Pankaj

+0

あなたのコードを見てください。以下はいくつかのコメントです。 a)バリデータの表示を設定する必要はありません。あなたの参照セクションValidatorValidateメソッドに配置されているようにそれを行います。 b)クライアントの検証関数がtrue/falseを返す必要はありません。 c)Page_IsValidをコードから操作することは想定されていません。 ValidatorValidateとその他のフレームワークコードによって処理されます。 d)何も理由のないコードがたくさんある。 – Ramesh

関連する問題