2012-05-10 12 views
1

私のprevious questionにカスタムコントロールと検証についてフォローアップしましたが、サーバー側の検証は動作していますが、クライアント側の検証を追加する方法を理解できないようです。私のWebフォーム上でクライアントサイドでカスタムコントロールの検証方法は?

[ValidationProperty("Text")] 
[ToolboxData("<{0}:DateSelect runat=server></{0}:DateSelect>")] 
public class DateSelect : System.Web.UI.WebControls.Panel 
{ 
private DropDownList day; 
private DropDownList month; 
private DropDownList year; 

public DateSelect() 
{ 
    day = new DropDownList(); 
    /* some code to create items for 'day' here */ 
    Controls.Add(day); 
    month = new DropDownList(); 
    /* some code to create items for 'month' here */ 
    Controls.Add(month); 
    year = new DropDownList(); 
    /* some code to create items for 'year' here */ 
    Controls.Add(year); 
} 


public string Text 
{ 
    get 
    { 
     return year.Text + "-" + month.Text + "-" + day.Text; 
    } 
} 
} 

私は、このコントロールを追加し、有効な日付に対してチェックするデータ型の操作でこのCompareValidatorを追加します。私は、コントロールを次のように持っています。バリデーターのEnableClientScriptfalseに設定し、カスタムコントロールがサーバー側で正しく検証され、正しい場合に正しいメッセージが提供されます。しかし、EnableClientScripttrueにするとすぐに、カスタムコントロールはクライアントサイドで検証され、DropDownListsに有効な日付が実際にあるときにエラーメッセージが表示されます。私は理由を把握しようと、私は正しい値が得られて出てくるんだろう決して考える.NETによって生成された次のJavaScriptで終わってきた:

function ValidatorGetValueRecursive(control) 
{ 
    if (typeof(control.value) == "string" && (control.type != "radio" || control.checked == true)) { 
     return control.value; 
    } 
    var i, val; 
    for (i = 0; i<control.childNodes.length; i++) { 
     val = ValidatorGetValueRecursive(control.childNodes[i]); 
     if (val != "") return val; 
    } 
    return ""; 
} 

は、だから私は、私が何かを追加する必要が信じていますバリデータが自分のコントロールを検証しようとするとすぐに呼び出され、3つのDropDownListsの選択された項目から検証する正しい値を生成するカスタムコントロール、おそらくはJavaScriptの部分。私はこのスクリプトをどこに追加するのか分かりません。すべてのポインタ?

答えて

1

あなたのコントロールには実際にいくつかのサーバーコントロールが含まれているので、他のコントロールと同様に、クライアント側のバリデーターをコントロールコレクションに追加することをお勧めします。

var ddl = new DropDownList(); 
ddl.ID = "ddlDay"; 
Controls.Add(ddl); 

var validator = new RequiredFieldValidator(); 
val.ControlToValidate = ddl.ID; 
val.ErrorMessage = "*"; //property to set this for all validators 
val.Display = ValidatorDisplay.Dynamic; //property to set this for all validators 
Controls.Add(validator); 

バリデータを追加したら、検証基、エラーメッセージ、表示タイプと同様に、コントロールにおけるバリの全てに適用するプロパティを公開することができるが、等

EDIT#1

組み合わせ入力を1つとして検証する場合は、を使用し、必要なクライアントスクリプトをコントロールに登録します。

これはまったくテストされていませんが、以下に、その概念を示す簡単なコード例を示します。

  • Custom Validator For Multiple Controls
  • :のは、クライアント側の検証用のカスタムバリデータを使用する方法について説明し、いくつかの記事です。ここ

    <script type="text/javascript"> 
        clientValidate = function(source, args){ 
    
         var ddl1 = document.getElementById("<%= ddl1.ClientID %>"); 
         var ddl2 = document.getElementById("<%= ddl2.ClientID %>"); 
    
         if (ddl1.options[e.selectedIndex].value.length == 0) 
          args.IsValid = false; 
         if (ddl2.options[e.selectedIndex].value.length == 0) 
          args.IsValid = false; 
    
        } 
    </script> 
    <asp:CustomValidator ID="MyCustomValidator" runat="server" 
        ErrorMessage="Invalid" 
        ClientValidationFunction="clientValidate" /> 
    

    :もちろん、あなたはStringBuilderか何かを使用して、コード内での検証機能を構築します

  • CustomValidator.ClientValidationFunction Property

EDIT#2

もう少し読んだところ、CustomValidatorはあなたのコンポジットコントロールと互換性があるはずです。

+0

私はあなたが言っていることを理解していますが、これによってクライアント側のバリデータが3つのDropDownListの選択項目を日付として組み合わせて検証する方法はありますか?また、私の現在の設定ではサーバ側の検証がうまく動作することに注意してください。 – Bazzz

+0

あなたが検証しようとしている入力があれば、 'CustomValidator'を使用して、検証を実行するために必要なクライアントスクリプトを挿入します。 –

+0

私はあなたの意見を理解していますが、他の方法で問題に近づくことを好みます。つまり、CompareValidatorがそのように動作するようにカスタムコントロールを適用します。この理由は、すべてのコントロールとバリデーターが、データベースが期待するフィールドとデータ型に基づいて動的に作成されるためです。私はあなたのソリューションは実現可能だと思うが、CompareValidatorはサーバー側で動作するので、クライアント側でも動作させることが可能でなければならないと感じている。 – Bazzz

関連する問題