The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何讓 UserControl 與 RequireFieldValidator 搭配使用

基本上只要是繼承於 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]