如何讓 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 的程式碼如下:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值