ASP.NET 2.0 的HiddenField控件

asp.net|控件

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"
 
 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="单击按钮" 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="post" action="Default.aspx" id="Form1">

  这是因为HiddenField是通过HTTP协议进行传递数据的,所以如果你通过" method="get"或者链接打开新的窗体页,那么HiddenField并不可用。

  另外,HiddenField并不是取代Session来维护状态的,在上面例子里,虽然你点击一次按钮可以显示你点击的次数但是并不是说它可以记录你的状态信息。如果你重新打开浏览器那么你看到的此处仍然是0而不是3。
HiddenField事件

HiddenField较为常用的是ValueChanged事件,该事件在Value值发生改变时触发该事件。然而在实际使用时,要知道页面记载顺序。在页面回传过程中,具体的页面周期你可以到如下网站查看

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事件触发,触发时间是:" + 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" 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属性,将 <input type="hidden" name="HiddenField1" id="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" Text="Button" />
</form>
</body>
</html>

  利用HiddenFile 并结合ASP.NET2.0提供的“交叉Cross Page”页面可以实现页面数据的传递,该情况针对这样的一种方案:
在一个注册页面里,需要用户输入数据,由于备注一栏的数据可能很多,可以在新窗口可以利用类似FreeTextBox的控件让用户
格式化文本,并在输入完毕后,返回原注册页面。关于这种情况,以后会介绍。

时间: 2024-12-29 19:03:45

ASP.NET 2.0 的HiddenField控件的相关文章

ASP.NET 2.0之ObjectDataSourc控件

asp.net|object|控件 学习asp.net2.0有一段时间了,我不是从1.1开始的,所以,也说不出2.0相对于1.1来讲有多大的变化或是在操作上有多大的便利,我这里只把我学习2.0的一些小经验与大家分享. 2.0中有一个ObjectDataSource数据源控件,通过它,可以把中间层或其它层的数据绑定到dropdownlist/datalist/repeater/gridview等数据控件中,为什么这里只ObjectDataSource而不提SqlDataSource或其它的数据源控

ASP.NET 2.0 和数据绑定控件:新的角度,新的做法

asp.net|控件|数据 适用于:Microsoft ASP.NET 1.xMicrosoft ASP.NET 2.0 摘要:了解 ASP.NET 2.0 中的用于生成自定义数据绑定控件的工具是如何演变的.   本页内容 为什么需要新的数据源模型  ASP.NET 2.0 中的数据绑定控件  分析要点  数据绑定机制   列表控件  HeadlineList 示例控件  管理自定义集合  关于复合控件的一点讨论  小结 为什么需要新的数据源模型数据绑定是开发人员在 ASP.NET 1.x 中发

ASP.NET 2.0中GridView控件的隐藏列的问题

Asp.net 2.0 GridView隐藏列visible="false" 后你就无法取得这列的值了, 而用datagrid就没有这个问题, MS这个混蛋老是改变游戏规则, 幸好我聪明, 在百度上搜到了别人的解决方法, 然后加入了自己的方法, 才解决问题: protected void GVList_RowDataBound(object sender, GridViewRowEventArgs e) { //隐藏不必要的列 if ((e.Row.RowType == DataCon

ASP.NET 2.0中Gridview控件高级技巧

ASP.NET 2.0中新增加的gridview控件的确十分强大,弥补了在asp.net 1.1中,使用datagrid控件时的不足之处.因为在asp.net 1.1中,在使用 datagrid时,很多情况下依然要编写大量的代码,十分不方便,而且有时需要很 多技巧.而在asp.net 2.0中,很多情况下,使用gridview控件的话,甚至只需 要拖拉控件,设置属性就可以了,不需要编写任何代码.在<使用ASP.NET 2.0 中的GridView控件>和<ASP.NET2.0中用Grid

ASP.NET 2.0的AccessDataSource控件

ASP.NET 2.0包含了AccessDataSource控件,用来从Access数据库中将数据提 取至ASP.NET 2.0(.aspx)页面.这个控件拥有的属性很简单.AccessDataSource 的最重要的属性是DataFile属性,用来指向硬盘上MDB文件的路径. AccessDataSource拥有的其他属性还有SelectCommand,用来设定一个显示需要 返回的结果集(表和列)的语句.SelectCommand必须使用SQL语法来定义. 在VWD中,可以用两种方式来添加Ac

虚拟主机下asp.net 2.0的导航控件treeview,menu等出错

asp.net|treeview|导航|控件|虚拟主机 这几天把一个网站部署到虚拟主机下,发现treeview和menu控件全部出了问题.开始以为是没有把aspnet_client 添加到wwwroot目录,联系服务商帮我添加了,问题依旧.于是搜索原因,发现2.0使用了一个WebResource.axd的资源映射,于是添加了<httpHandlers><add path="WebResource.axd" verb="GET" type="

探讨ASP.NET 2.0的Web控件改进之概述

asp.net|web|控件 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于你的控件开发中. 首先应该注意的是,你以前使用ASP.NET 1.1(或1.0)开发的所有Web控件在2.0版本下将继续良好运行-微软并没有破坏你的现有代码

asp.net 2.0 上传控件的使用

asp.net|控件|上传|上传控件 试用了一下asp.net 2.0的上传控件,还是挺方便的. 分享代码如下:     protected void Button1_Click(object sender, EventArgs e)    {        try        {            判断文件大小#region 判断文件大小            int intFileLength = this.FileUpload1.PostedFile.ContentLength;  

ASP.NET 2.0的导航控件treeview和menu的实例

asp.net|treeview|导航|控件 ASP.net2.0 为用户提供了treeview和menu导航控件,使用十分方便,极大提高了用户开发项目的速度和效率. 尤其是treeview和menu绑定web.sitemap之类的XML文件,形成层次数据非常便捷. 但我在项目开发过程中,很多地方是需要绑定关系数据库,毕竟关系数据库是最常用.操作最方便的存储形式. 对于treebview与关系数据库绑定可以动态绑定,也就是在page_load事件中首先添加第一级节点,然后在treeview的Se