国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET 2.0 的HiddenField控件

2024-07-10 13:06:27
字體:
供稿:網(wǎng)友
hiddenfield控件顧名思義就是隱藏輸入框的服務(wù)器控件,它能讓你保存那些不需要顯示在頁面上的且對安全性要求不高的數(shù)據(jù)。也許這個時候應(yīng)該有這么一個疑問,為什么有了viewstate、session和cookie等狀態(tài)保存機制,還需要用起hiddenfield呢?

        增加hiddenfield,其實是為了讓整個狀態(tài)管理機制的應(yīng)用程度更加全面。因為不管是viewstate、cookie還是session,都有其失效的時候,比如用戶因某種需求要求設(shè)置viewstate為false,或者環(huán)境條件限制使用cookie,或者用戶長時間沒有動作導致session過期等等,那這個時候hiddenfield無疑是最佳選擇。

        hiddenfield控件的作用簡單的說是用于存儲需要在向服務(wù)器的發(fā)送間保持的值。它作為 <input type= "hidden"/> 元素呈現(xiàn),并且通過添加runat=”server”就可以使它成為標準的html服務(wù)器控件。下面列出的是asp.net hiddenfield web服務(wù)器控件可以使用的屬性和事件。

<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)于這種情況,以后會介紹。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 偏关县| 五原县| 沁源县| 丰都县| 梓潼县| 上思县| 深圳市| 和政县| 祁门县| 阳东县| 青田县| 遂平县| 喀喇沁旗| 漳州市| 乌拉特前旗| 武安市| 曲周县| 习水县| 武义县| 太谷县| 恩平市| 西畴县| 安吉县| 墨竹工卡县| 凉山| 电白县| 眉山市| 叶城县| 闻喜县| 宝应县| 茶陵县| 迁西县| 通海县| 南召县| 巍山| 叙永县| 综艺| 许昌县| 洞口县| 昭平县| 延边|