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的控件让用户格式化文本并在输入完毕后返回原注册页面关于这种情况以后会介绍