2011-06-30 19 views
2

autopostbackを使用しているドロップダウンリストのカスタムバリデーターを記述しています。検証を完全に無視するようです。なぜそれは無視され、簡単な修正がありますか?コードの後ろドロップダウンリストのcustomvalidatorが呼び出されていない(明らかに)

 <asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional" Visible="true" RenderMode="Inline"> 
     <ContentTemplate> 
     <asp:DropDownList ID="ddlCommandAssign" runat="server" AutoPostBack="true"> 
     </asp:DropDownList> 
      <asp:CustomValidator id="val_command_assigned" runat="server" 
      ErrorMessage="* " 
      display="Static" 
      OnServerValidate="commandAssigned" 
      /> 
       </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="ddlCommandAssign" 
       EventName="SelectedIndexChanged" /> 
     </Triggers> 

    </asp:UpdatePanel> 

::私はControlToValidate

asp.net使用していませんでした

注デバッグ目的のために

Sub commandAssigned(ByVal source As Object, _ 
    ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) 

    Dim s As String 
    s = ddlCommandAssign.SelectedValue 
    'if s = "1" then 
    ' args.IsValid = true 
    'else 
    ' args.IsValid = False 
    'end if 
    args.IsValid = False 
End Sub 

は、私はそれが毎回失敗します。

背番号を一切実行していないようです。デバッグのために

は、私はバリデータが呼び出されることは決してありませんことをも示して呼ばれることは決してありませんラインのResponse.Redirect(「dummy.html」)...、(私は思う)を追加しました。

+0

私もバリにValidateEmptyText = "true" を追加しました。まだ運がありません。 – elbillaf

+0

は、それはあなたがそれがポストバックを通じて検証持っているために重要なのですか?あなたはクライアント側でそれに反対していますか?また、ControlToValidateを使用していない理由もあります。私はあなたが言ったように、あなたがしなかったことに気づいたが、私はなぜそれがわからない。 –

+0

私はユーザーが最初に選択した値に基づいてドロップダウンリストを変更しています。 (私はこれが嫌いですが、ユーザは古いシステムの仕組みに慣れています)私が変更した後でddlを更新するには、autopostbackを使う必要があると思います。私はcontroltovalidateの有無にかかわらず試しました。私は半ダースのサイトで読んだ情報に基づいていなかった。 (アドバイスがどれほど信頼できるのかは分かりませんが、私は一般的に、仕事に就いている人は私が何かを知っていると仮定しています) – elbillaf

答えて

2

更新パネルを取り外し、JavaScriptを使用して、クライアント側自体の検証を行うようにしてください。

クライアント側の検証

JavaScriptのイベント定義、

function ValidateFunction(sender,args) 
{ 
    var ddlCommandAssign= document.getElementById('<%=ddlCommandAssign.ClientID %>'); 
    if (ddlCommandAssign.options[control.selectedIndex].value=='0') 
    { args.IsValid = false;//This shows the validation error message and stops execution at client side itself.} 
    else { args.IsValid = true;//This will return to the server side. }  
} 

ASPXセクション:

<asp:DropDownList ID="DropDownList1" runat="server"> 
     <asp:ListItem Value="1">select</asp:ListItem> 
     <asp:ListItem Value="2">sdasda</asp:ListItem> 
    </asp:DropDownList> 
    <asp:CustomValidator ID="valCustmID" runat="server" ErrorMessage="*" ForeColor="Red" 
     ValidationGroup="group1" ClientValidationFunction="ValidateFunction"></asp:CustomValidator> 
    <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1" /> 

注:カスタムバリデータとトリガーボタンの両方が同じ必要があります検証グループ。

サーバーサイド検証

あなたは本当に検証サーバ側は以下のコードを参照する場合:

 <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:DropDownList ID="DropDownList1" runat="server"> 
       <asp:ListItem Value="1">select</asp:ListItem> 
       <asp:ListItem Value="2">sdasda</asp:ListItem> 
      </asp:DropDownList> 
      <asp:CustomValidator ID="CustomValidator1" OnServerValidate="commandAssigned" runat="server" ErrorMessage="*" ValidationGroup="group1"></asp:CustomValidator> 
      <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

注:カスタムバリデータとトリガーボタンの両方が同じ検証を持っている必要がありますグループ。イベントの背後にある

のコードは以下のようになります。このことができます

protected void commandAssigned(object source, ServerValidateEventArgs args) 
    { 
     if (DropDownList1.SelectedItem.Value == "1")    
      args.IsValid = false; //since you gave controlToValidate="DropDownList1" this will display the error message.  
     else   
      args.IsValid = true;    
    } 

希望..私は、しかし...同じ問題に直面していた

+1

検証を実行するためにクライアント側のコードだけを使うことは決して*決して*してはいけません。必要に応じて、サーバー側の検証と組み合わせて使用​​できますが、すべてのケースでサーバー側の検証を行う必要があります。 –

+0

それを試してみます。私はddlをオンザフライで変更しているため、更新パネルを使用しています(置き換えたいレガシーに慣れているユーザーのため) - 更新パネルを再表示する必要があると思っていましたが、起こるおかげで – elbillaf

+0

フレデリック、この1冊の補足ありがとう。私はそれを念頭に置いて、サーバー側の解決策に向かって作業しますが、私は彼の解決策を試してみて、それが私をより近づけるかどうかを見ていきます。私は絶望的です。 – elbillaf

1

あなたは適切な名前のControlToValidateプロパティを使用して検証するコントロールを指定するを持っている

<asp:CustomValidator id="val_command_assigned" runat="server" 
    ErrorMessage="* " Display="Static" OnServerValidate="commandAssigned" 
    ControlToValidate="ddlCommandAssign" /> 

そうでない場合は、カスタムバリデータは一切検証を行いません。

+0

応答に感謝します。私はそれから始まったが、うまくいかなかった。しかし、私はもう一度やり直してみた。まだ動作しません。コントロールが空の文字列を返す場合、検証が呼び出されないという数多くの参照が見つかりました。 (それ以前はありましたが、私はそれを変更しました) – elbillaf

+0

@ TheFallibleFiend、私は空の文字列の制限がカスタムバリデータにはとにかく当てはまるとは思いません。 'UpdatePanel'を一時的に削除するとハンドラが呼び出されますか? –

+0

私はちょうどそれを試みました - しかし、私は更新パネルを削除した後でもまだ起動することができません。 私は以前にそれを試してみるべきでした。 – elbillaf

2

が最終的に解決策を得ました。 ドロップダウンリストにアイテムが追加されていない場合にのみ発生します。

関連する問題