1

カスタム コントロールと検証に関する以前の質問に続き、サーバー側の検証が機能するようになりましたが、クライアント側の検証を追加する方法がわかりません。私は次の制御をしなければなりません:

[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;
    }
 }
}

私の Web フォームでは、このコントロールを追加し、DataType 操作に CompareValidator を追加して、有効な日付をチェックします。バリデーターを設定EnableClientScriptするfalseと、カスタム コントロールがサーバー側で適切に検証され、正しいケースで正しいメッセージが提供されます。ただし、カスタム コントロールに目を向けるとすぐにEnableClientScriptクライアントtrue側が検証され、実際には 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 の一部であるカスタム コントロールに何かを追加する必要があると思います。このスクリプトを追加する場所がわかりません。ポインタはありますか?

4

1 に答える 1

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);

バリデーターを追加した後、検証グループ、エラーメッセージ、表示タイプなど、コントロール内のすべてのバリデーターに適用するプロパティを公開できます。

編集#1

結合された入力を1つとして検証する場合は、を使用しCustomValidatorて、コントロールを介して必要なクライアントスクリプトを登録します。

私はこれをまったくテストしていませんが、以下は概念を示すための簡単なコード例です。明らかに、StringBuilderまたは何かを使用してコードで検証関数を構築します。

<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" />

クライアント側の検証にカスタムバリデーターを使用する方法を説明する記事を次に示します。

編集#2

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

于 2012-05-10T18:40:31.957 に答える