カスタム コントロールと検証に関する以前の質問に続き、サーバー側の検証が機能するようになりましたが、クライアント側の検証を追加する方法がわかりません。私は次の制御をしなければなりません:
[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 の一部であるカスタム コントロールに何かを追加する必要があると思います。このスクリプトを追加する場所がわかりません。ポインタはありますか?