商業(yè)源碼熱門下載www.html.org.cn
hiddenfield控件顧名思義就是隱藏輸入框的服務器控件,它能讓你保存那些不需要顯示在頁面上的且對安全性要求不高的數(shù)據(jù)。也許這個時候應該有這么一個疑問,為什么有了viewstate、session和cookie等狀態(tài)保存機制,還需要用起hiddenfield呢?
增加hiddenfield,其實是為了讓整個狀態(tài)管理機制的應用程度更加全面。因為不管是viewstate、cookie還是session,都有其失效的時候,比如用戶因某種需求要求設置viewstate為false,或者環(huán)境條件限制使用cookie,或者用戶長時間沒有動作導致session過期等等,那這個時候hiddenfield無疑是最佳選擇。
hiddenfield控件的作用簡單的說是用于存儲需要在向服務器的發(fā)送間保持的值。它作為 <input type= "hidden"/> 元素呈現(xiàn),并且通過添加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 的值將呈現(xiàn)給客戶端瀏覽器,所以它不適用于存儲安全敏感的值。若要為 hiddenfield 控件指定值,請使用 value 屬性,請注意是value而不是text。事實上hiddenfield并沒有text屬性,這和dropdownlist、checkboxlist等標準按鈕的屬性命名方式一致。在標準的屬性命名方式中,text的值是呈現(xiàn)給用戶看到的,而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="單擊按鈕" runat="server" />
單擊 <asp:label id=label1 text="0" runat=server /> 次
</form>
</body>
</html>
在上面代碼中, <asp:hiddenfield id=hiddenfield1 runat=server />就定義了一個隱藏控件在按鈕的單擊事件里計算用戶單擊的次數(shù),并將改次數(shù)賦值給label1。
你可以將上面代碼中的 <asp:hiddenfield id=hiddenfield1 runat=server />改為<input type=hidden id=hiddenfield1 runat=server >也是可以的
在使用上面代碼里,如果你從瀏覽器里查看源代碼會得到如下的信息:
<form name="form1" method="post" action="default.aspx" id="form1">
這是因為hiddenfield是通過http協(xié)議進行傳遞數(shù)據(jù)的,所以如果你通過" method="get"或者鏈接打開新的窗體頁,那么hiddenfield并不可用。
另外,hiddenfield并不是取代session來維護狀態(tài)的,在上面例子里,雖然你點擊一次按鈕可以顯示你點擊的次數(shù)但是并不是說它可以記錄你的狀態(tài)信息。如果你重新打開瀏覽器那么你看到的此處仍然是0而不是3。
hiddenfield事件
hiddenfield較為常用的是valuechanged事件,該事件在value值發(fā)生改變時觸發(fā)該事件。然而在實際使用時,要知道頁面記載順序。在頁面回傳過程中,具體的頁面周期你可以到如下網(wǎng)站查看
http://msdn2.microsoft.com/zh-cn/library/ms178472.aspx
下面的例子說明了這個問題
<head>
<script runat="server" language="c#">
protected void page_load(object sender, eventargs e)
{ response.write("<p>頁面的page_load事件觸發(fā),觸發(fā)時間是:" + 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的值前事件觸發(fā),觸發(fā)時間是:" + 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事件觸發(fā),觸發(fā)時間是:" + 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>
在這個例子里,我們想要的結(jié)果是:當用戶單擊按鈕時,通過按鈕的button1_click事件更改hiddenfield1的value,然后再觸發(fā)hiddenfield1的hiddenfield1_valuechanged事件,然而事實真的如此嗎?
運行上面的代碼,得到的結(jié)果正如你看到的,每次單擊時,button確實改變了hiddenfield的值,但是我們在hiddenfield1_valuechanged里定義的輸出并沒有執(zhí)行,換句話說頁面并沒有執(zhí)行valuechanged事件
要理解這個問題還需要了解頁面的聲明周期,在頁面周期過程中,你可以看到在page_init里是讀取或初始化控件屬性,然后再是control events。
這里的事件意思是說: 在page_init事件里,web頁面會接受用戶回傳的數(shù)據(jù),例如將 <span id="label1">label</span>賦值給id為label1的text屬性,將 <input type="hidden" name="hiddenfield1" id="hiddenfield1" value="0" />的value值賦值給hiddenfield1的value屬性。等所有初始化完畢了,頁面才開始執(zhí)行控件的事件--button1_click,在button事件里將hiddenfield的value值改變。那么這里既然已經(jīng)將value值改變?yōu)槭裁礇]有執(zhí)行valuechanged事件呢?
此時,雖然這里已經(jīng)將value值改變,但是在page_init里保存的這是因為當前單擊button按鈕時,雖然改變了hiddenfield但同樣又一次觸發(fā)了頁面的回復,也就是雖然在上一此hiddenvalue的值為0,而此次將其值改為1,但是在頁面回傳后,由于viewstate會保存上次的裝(這里是1),所以在page_init里,認為hiddenfield的初始值為1,而本次還是1,使得它感覺數(shù)據(jù)沒有變化,所以仍然不會觸發(fā)valuechanged事件
當然,你可以禁用hiddenfield來進行處理,就可以執(zhí)行valuechanged事件,但是事實上你禁用viewstate后,頁面不再保存viewstate的值使得頁面認為每一次請求hiddenfield的都是新的,例如如下代碼:
你并沒有改變hiddenfield的值,但是仍然每次都執(zhí)行。
<%@ 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 并結(jié)合asp.net2.0提供的“交叉cross page”頁面可以實現(xiàn)頁面數(shù)據(jù)的傳遞,該情況針對這樣的一種方案:
在一個注冊頁面里,需要用戶輸入數(shù)據(jù),由于備注一欄的數(shù)據(jù)可能很多,可以在新窗口可以利用類似freetextbox的控件讓用戶
格式化文本,并在輸入完畢后,返回原注冊頁面。關(guān)于這種情況,以后會介紹
新聞熱點
疑難解答
圖片精選