· HiddenField控件顧名思義就是隱藏輸入框的服務器控件,他能讓你保存那些不必顯示在頁面上的且對安全性需求不高的數據。也許這個時候應該有這么一個疑問,為什么有了ViewState、Session和Cookie等狀態保存機制,還需要用起HiddenField呢?
增加HiddenField,其實是為了讓整個狀態管理機制的應用程度更加全方面。因為不管是ViewState、Cookie還是Session,都有其失效的時候,比如用戶因某種需求設置ViewState為false,或環境條件限制使用Cookie,或用戶長時間沒有動作導致Session過期等等,那這個時候HiddenField無疑是最佳選擇。
HiddenField控件的作用簡單的說是用于存儲需要在向服務器的發送間保持的值。他作為<input type= hidden/> 元素呈現,并且通過添加runat=”server”就能使他成為標準的HTML服務器控件。下面列出的是ASP.NET HiddenField Web服務器控件能使用的屬性和事件。
<asp:HiddenField
EnableTheming=True|False
EnableViewState=True|False
ID=string
OnDataBinding=DataBinding event handler
OnDisposed=Disposed event handler
OnInit=Init event handler
OnLoad=Load event handler
OnPreRender=PreRender event handler
OnUnload=Unload event handler
OnValueChanged=ValueChanged event handler
runat=server
SkinID=string
Value=string
Visible=True|False
/>
復制代碼
因為 HiddenField 的值將呈現給客戶端瀏覽器,所以他不適用于存儲安全敏感的值。若要為HiddenField 控件指定值,請使用 Value 屬性,請注意是Value而不是Text。事實上HiddenField并沒有Text屬性,這和DropDownList、CheckBoxList等標準按鈕的屬性命名方式一致。在標準的屬性命名方式中,Text的值是呈現給用戶看到的,而Value的值則是通長是通過代碼進行控制的。例如你能讓DropDownList的Text屬性顯示用戶名而讓他的Value存儲用戶的編號。
下面的代碼顯示的是改控件的基本使用。
<html>
<head>
<script language=C# runat=server>
void Button1_Click(object sender, EventArgs e)
{
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = 0;
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value)+1).ToString();
Label1.Text = HiddenField1.Value;
}
</script>
</head>
<body>
<h3><font face=Verdana>HiddenField</font></h3>
<form runat=server>
<asp:HiddenField id=HiddenField1 runat=Server />
<asp:Button id=Button1 Text=單擊按鈕 onclick=Button1_Click runat=server />
單擊 <asp:Label id=Label1 Text=0 runat=server /> 次
</form>
</body>
</html>
復制代碼
在上面代碼中, <asp:HiddenField id=HiddenField1 runat=Server />就定義了一個隱藏控件在按鈕的單擊事件里計算用戶單擊的次數,并將改次數賦值給Label1。
你能將上面代碼中的 <asp:HiddenField id=HiddenField1 runat=Server />改為<input type=hidden id=HiddenField1 runat=Server >也是能的
在使用上面代碼里,如果你從瀏覽器里查看原始碼會得到如下的信息:
<form name=Form1 method=postaction=Default.aspx id=Form1>
這是因為HiddenField是通過HTTP協議進行傳遞數據的,所以如果你通過method=get或鏈接打開新的窗體頁,那么HiddenField并不可用。
另外,HiddenField并不是取代Session來維護狀態的,在上面例子里,雖然你點擊一次按鈕能顯示你點擊的次數不過并不是說他能記錄你的狀態信息。如果你重新打開瀏覽器那么你看到的此處仍然是0而不是3。
HiddenField事件
HiddenField較為常用的是ValueChanged事件,該事件在Value值發生改動時觸發該事件。然而在實際使用時,要知道頁面記載順序。在頁面回傳過程中,具體的頁面周期你能到如下網站查看
下面的例子說明了這個問題
<head>
<script runat=server language=c#>
protected void Page_Load(object sender, EventArgs e)
{ Response.Write(<p>頁面的Page_Load事件觸發,觸發時間是: + DateTime.Now.ToString());
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = 0; }
protected void Button1_Click(object sender, EventArgs e)
{ Response.Write(<p>Button1_Click為改動Hidden的值前事件觸發,觸發時間是: + DateTime.Now.ToString());
HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = HiddenField1.Value;
}
protected void HiddenField1_ValueChanged(object sender, EventArgs e)
{ Response.Write(<p>HiddenField的 ValueChanged事件觸發,觸發時間是: + DateTime.Now.ToString()); }
</script>
</head>
<body>
<form id=form1 runat=server>
<div> <asp:HiddenField ID=HiddenField1 runat=server OnValueChanged=HiddenField1_ValueChanged />
</div> <asp:Label ID=Label1 runat=server Text=Label></asp:Label>
<br /> <asp:Button ID=Button1 runat=server OnClick=Button1_Click Text=Button />
</form></body>
</html>
復制代碼
在這個例子里,我們想要的結果是:當用戶單擊按鈕時,通過按鈕的Button1_Click事件更改HiddenField1的Value,然后再觸發HiddenField1的HiddenField1_ValueChanged事件,然而事實真的如此嗎?
運行上面的代碼,得到的結果正如你看到的,每次單擊時,Button確實改動了HiddenField的值,不過我們在HiddenField1_ValueChanged里定義的輸出并沒有執行,換句話說頁面并沒有執行ValueChanged事件
要理解這個問題還需要了解頁面的聲明周期,在頁面周期過程中,你能看到在Page_Init里是讀取或初始化控件屬性,然后再是Control events。
這里的事件意思是說:在Page_Init事件里,Web頁面會接受用戶回傳的數據,例如將 <span id=Label1>Label</span>賦值給ID為Label1的Text屬性,將 <inputtype=hidden name=HiddenField1id=HiddenField1 value=0 />的value值賦值給HiddenField1的Value屬性。等所有初始化完畢了,頁面才開始執行控件的事件--Button1_Click,在Button事件里將HiddenField的Value值改動。那么這里既然已將Value值改動為什么沒有執行ValueChanged事件呢?
此時,雖然這里已將Value值改動,不過在Page_Init里保存的這是因為當前單擊Button按鈕時,雖然改動了HiddenField但同樣又一次觸發了頁面的回復,也就是雖然在上一此HiddenValue的值為0,而此次將其值改為1,不過在頁面回傳后,由于ViewState會保存上次的裝(這里是1),所以在Page_Init里,認為HiddenField的初始值為1,而本次還是1,使得他感覺數據沒有變化,所以仍然不會觸發ValueChanged事件
當然,你能禁用HiddenField來進行處理,就能執行ValueChanged事件,不過事實上你禁用ViewState后,頁面不再保存ViewState的值使得頁面認為每一次請求HiddenField的都是新的,例如如下代碼:
你并沒有改動Hiddenfield的值,不過仍然每次都執行。
<%@ Page EnableViewState=false %>
<head>
<script runat=server language=c#>
protected void Page_Load(object sender, EventArgs e)
{
if (HiddenField1.Value == String.Empty)
HiddenField1.Value = 111;
}
protected void Button1_Click(object sender, EventArgs e)
{ // HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
Label1.Text = TextBox1.Text; }
protected void HiddenField1_ValueChanged(object sender, EventArgs e)
{ Response.Write(Changed. + DateTime.Now.ToString());
Response.Write(HiddenField1.Value);
Response.Write(TextBox1.Text); }
</script>
</head>
<body>
<form id=form1 runat=server> <div>
<asp:HiddenField ID=HiddenField1 runat=server OnValueChanged=HiddenField1_ValueChanged />
</div>
<asp:Label ID=Label1 runat=server Text=Label></asp:Label>
<br />
<asp:TextBox runat=server ID=TextBox1></asp:TextBox>
<asp:Button ID=Button1 runat=server OnClick=Button1_Click Text=Button />
</form>
</body>
</html>
復制代碼
利用HiddenFile 并結合ASP.NET2.0提供的“交叉Cross Page”頁面能實現頁面數據的傳遞,該情況針對這樣的一種方案:
在一個注冊頁面里,需要用戶輸入數據,由于備注一欄的數據可能非常多,能在新窗口能利用類似FreeTextBox的控件讓用戶
格式化文本,并在輸入完畢后,返回原注冊頁面。關于這種情況,以后會介紹
