基本上只要是繼承於 Control 型別的控制項都可以跟 *Validator 控制項搭配使用!只是你必須在 UserControl 的類別特別定義 2 個 Class Attribute 才能正確使用。
一個是 [ValidationProperty("Text")] ,而另一個是[ControlValueProperty("Text")] ,分別用來宣告此類別的驗證用屬性要取得此類別的哪一個屬性,與此控制項的 Value 是屬於哪一個屬性。
但其中有個很重要的觀念,就是如果 UserControl 要搭配使用 RequiredFieldValidator 時,若要讓啟用 EnableClientScript 時可以正常運作 ( 也就是直接在 Browser 端直接用 JavaScript 先驗證其值 ),必須在該 UserControl 加上一個隱藏欄位,且以該隱藏欄位的 id 必須以這個 UserControl 的 this.ClientID 為名,才能讓 RequiredFieldValidator 控制項透過 JavaScript 取得要驗證的值,且當 UserControl 當中的欄位資料更新的時候,也要立即透過 JavaScript 一併更新該隱藏欄位的值才行!如果不加上這個隱藏欄位並不會出錯,只是做驗證的時候必須要等表單 PostBack 回伺服器端才能驗證而已,但這樣就顯的不有點美中不足了。
以下是個簡單的範例,各位看程式碼就知道我在寫什麼了,注意【粗體字】的部分。
[code:xml]
<%@ Control Language="C#" ClassName="City" CodeFile="City.ascx.cs" Inherits="UserControls_DataType_City" %>
<asp:DropDownList
ID="ddlCity"
runat="server"
EnableViewState="true"
AutoPostBack="false">
</asp:DropDownList>
[/code]
Code Behind 的程式碼如下:
[code:c#]
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;
[ValidationProperty("Text"), ControlValueProperty("Text")]
public partial class UserControls_DataType_City : System.Web.UI.UserControl
{
[Bindable(true)]
[Description("台灣縣市")]
[Category("Appearance")]
public string Text
{
get
{
return ddlCity.SelectedValue;
}
set
{
ddlCity.SelectedValue = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlCity.Items.Add(new ListItem("-- 請選擇 --", ""));
ddlCity.Items.Add(new ListItem("基隆市", "基隆市"));
ddlCity.Items.Add(new ListItem("台北市", "台北市"));
ddlCity.Items.Add(new ListItem("台北縣", "台北縣"));
ddlCity.Items.Add(new ListItem("桃園縣", "桃園縣"));
ddlCity.Items.Add(new ListItem("新竹市", "新竹市"));
ddlCity.Items.Add(new ListItem("新竹縣", "新竹縣"));
ddlCity.Items.Add(new ListItem("苗栗縣", "苗栗縣"));
ddlCity.Items.Add(new ListItem("台中市", "台中市"));
ddlCity.Items.Add(new ListItem("台中縣", "台中縣"));
ddlCity.Items.Add(new ListItem("彰化縣", "彰化縣"));
ddlCity.Items.Add(new ListItem("南投縣", "南投縣"));
ddlCity.Items.Add(new ListItem("雲林縣", "雲林縣"));
ddlCity.Items.Add(new ListItem("嘉義市", "嘉義市"));
ddlCity.Items.Add(new ListItem("嘉義縣", "嘉義縣"));
ddlCity.Items.Add(new ListItem("台南市", "台南市"));
ddlCity.Items.Add(new ListItem("台南縣", "台南縣"));
ddlCity.Items.Add(new ListItem("高雄市", "高雄市"));
ddlCity.Items.Add(new ListItem("高雄縣", "高雄縣"));
ddlCity.Items.Add(new ListItem("屏東縣", "屏東縣"));
ddlCity.Items.Add(new ListItem("台東縣", "台東縣"));
ddlCity.Items.Add(new ListItem("花蓮縣", "花蓮縣"));
ddlCity.Items.Add(new ListItem("宜蘭縣", "宜蘭縣"));
ddlCity.Items.Add(new ListItem("澎湖縣", "澎湖縣"));
ddlCity.Items.Add(new ListItem("金門縣", "金門縣"));
ddlCity.Items.Add(new ListItem("連江縣", "連江縣"));
}
// 為了要讓 RequireFieldValidator 的 EnableClientScript 屬性
// 可以正常運作,需要定義一個以 this.ClientID 為名的欄位,才
// 可以供 Validator 控制項的 JavaScript 做判斷!
Page.ClientScript.RegisterHiddenField(this.ClientID, Text);
ddlCity.Attributes["onchange"] =
"document.getElementById('" + this.ClientID + "').value = this.value;";
}
}
[/code]