HiddenField控件顧名思義就是隱藏輸入框的服務器控件它能讓你保存那些不需要顯示在頁面上的且對安全性要求不高的數據也許這個時候應該有這麼一個疑問為什麼有了ViewStateSession和Cookie等狀態保存機制還需要用起HiddenField呢?
增加HiddenField其實是為了讓整個狀態管理機制的應用程度更加全面因為不管是ViewStateCookie還是Session都有其失效的時候比如用戶因某種需求要求設置ViewState為false或者環境條件限制使用Cookie或者用戶長時間沒有動作導致Session過期等等那這個時候HiddenField無疑是最佳選擇
HiddenField控件的作用簡單的說是用於存儲需要在向服務器的發送間保持的值它作為 <input type= hidden/> 元素呈現並且通過添加runat=server就可以使它成為標准的HTML服務器控件下面列出的是ASPNET HiddenField Web服務器控件可以使用的屬性和事件
<aspHiddenField 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屬性這和DropDownListCheckBoxList等標准按鈕的屬性命名方式一致在標准的屬性命名方式中Text的值是呈現給用戶看到的而Value的值則是通長是通過代碼進行控制的例如你可以讓DropDownList的Text屬性顯示用戶名而讓它的Value存儲用戶的編號
下面的代碼顯示的是改控件的基本使用
<html> <head> <script language=C# runat=server> void Button_Click(object sender EventArgs e)
{ if (HiddenFieldValue == StringEmpty)
HiddenFieldValue =
HiddenFieldValue = (ConvertToInt(HiddenFieldValue)+)ToString()LabelText = HiddenFieldValue} </script> </head> <body> <h><font face=Verdana>HiddenField</font></h> <form runat=server> <aspHiddenField id=HiddenField runat=Server /> <aspButton id=Button Text=單擊按鈕 onclick=Button_Click runat=server />單擊 <aspLabel id=Label Text= runat=server /> 次</form> </body> </html>
在上面代碼中 <aspHiddenField id=HiddenField runat=Server />就定義了一個隱藏控件在按鈕的單擊事件裡計算用戶單擊的次數並將改次數賦值給Label
你可以將上面代碼中的 <aspHiddenField id=HiddenField runat=Server />改為<input type=hidden id=HiddenField runat=Server >也是可以的
在使用上面代碼裡如果你從浏覽器裡查看源代碼會得到如下的信息<form name=Form method=post action=Defaultaspx id=Form>這是因為HiddenField是通過HTTP協議進行傳遞數據的所以如果你通過 method=get或者鏈接打開新的窗體頁那麼HiddenField並不可用
另外HiddenField並不是取代Session來維護狀態的在上面例子裡雖然你點擊一次按鈕可以顯示你點擊的次數但是並不是說它可以記錄你的狀態信息如果你重新打開浏覽器那麼你看到的此處仍然是而不是
HiddenField事件
HiddenField較為常用的是ValueChanged事件該事件在Value值發生改變時觸發該事件然而在實際使用時要知道頁面記載順序在頁面回傳過程中具體的頁面周期你可以到如下網站查看cn/library/msaspx下面的例子說明了這個問題
<head> <script runat=server language=c#> protected void Page_Load(object sender EventArgs e)
{ ResponseWrite(<p>頁面的Page_Load事件觸發觸發時間是 + DateTimeNowToString())if (HiddenFieldValue == StringEmpty)
HiddenFieldValue = }
protected void Button_Click(object sender EventArgs e)
{ ResponseWrite(<p>Button_Click為改變Hidden的值前事件觸發觸發時間是 + DateTimeNowToString())HiddenFieldValue = (ConvertToInt(HiddenFieldValue) + )ToString()LabelText = HiddenFieldValue
}
protected void HiddenField_ValueChanged(object sender EventArgs e)
{ ResponseWrite(<p>HiddenField的 ValueChanged事件觸發觸發時間是 + DateTimeNowToString()) }
</script> </head>
<body>
<form id=form runat=server>
<div> <aspHiddenField ID=HiddenField runat=server OnValueChanged=HiddenField_ValueChanged />
</div> <aspLabel ID=Label runat=server Text=Label></aspLabel>
<br /> <aspButton ID=Button runat=server OnClick=Button_Click Text=Button />
</form></body>
</html>
在這個例子裡我們想要的結果是當用戶單擊按鈕時通過按鈕的Button_Click事件更改HiddenField的Value然後再觸發HiddenField的HiddenField_ValueChanged事件然而事實真的如此嗎?
運行上面的代碼得到的結果正如你看到的每次單擊時Button確實改變了HiddenField的值但是我們在HiddenField_ValueChanged裡定義的輸出並沒有執行換句話說頁面並沒有執行ValueChanged事件要理解這個問題還需要了解頁面的聲明周期在頁面周期過程中你可以看到在Page_Init裡是讀取或初始化控件屬性然後再是Control events這裡的事件意思是說 在Page_Init事件裡Web頁面會接受用戶回傳的數據例如將 <span id=Label>Label</span>賦值給ID為Label的Text屬性將 <input type=hidden name=HiddenField id=HiddenField value= />的value值賦值給HiddenField的Value屬性等所有初始化完畢了頁面才開始執行控件的事件——Button_Click在Button事件裡將HiddenField的Value值改變那麼這裡既然已經將Value值改變為什麼沒有執行ValueChanged事件呢?
此時雖然這裡已經將Value值改變但是在Page_Init裡保存的這是因為當前單擊Button按鈕時雖然改變了HiddenField但同樣又一次觸發了頁面的回復也就是雖然在上一此HiddenValue的值為而此次將其值改為但是在頁面回傳後由於ViewState會保存上次的裝(這裡是)所以在Page_Init裡認為HiddenField的初始值為而本次還是使得它感覺數據沒有變化所以仍然不會觸發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 (HiddenFieldValue == StringEmpty)
HiddenFieldValue =
}
protected void Button_Click(object sender EventArgs e)
{ // HiddenFieldValue = (ConvertToInt(HiddenFieldValue) + )ToString()LabelText = TextBoxText }
protected void HiddenField_ValueChanged(object sender EventArgs e)
{ ResponseWrite(Changed + DateTimeNowToString())ResponseWrite(HiddenFieldValue)ResponseWrite(TextBoxText) }
</script> </head> <body>
<form id=form runat=server> <div>
<aspHiddenField ID=HiddenField runat=server OnValueChanged=HiddenField_ValueChanged />
</div>
<aspLabel ID=Label runat=server Text=Label></aspLabel>
<br /> <aspTextBox runat=server ID=TextBox></aspTextBox>
<aspButton ID=Button runat=server OnClick=Button_Click Text=Button />
</form>
</body>
</html>
利用HiddenFile 並結合ASPNET提供的交叉Cross Page頁面可以實現頁面數據的傳遞該情況針對這樣的一種方案在一個注冊頁面裡需要用戶輸入數據由於備注一欄的數據可能很多可以在新窗口可以利用類似FreeTextBox的控件讓用戶格式化文本並在輸入完畢後返回原注冊頁面關於這種情況以後會介紹
From:http://tw.wingwit.com/Article/program/net/201311/12579.html