ASP.NET2.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-11-03 16:04:33

ASP.NET2.0 HiddenField控件的相关文章

ASP.NET2.0组件控件开发视频 初体验

原文:ASP.NET2.0组件控件开发视频 初体验                               ASP.NET2.0组件控件开发视频 初体验        录了视频,质量不是很好,大家体验下.我会重新录制的 如果不清楚,可以看看http://v.youku.com/v_show/id_XNDg0MTAxNjA=.html   系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发

【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件

分页控件正式命名为 QuickPager ASP.NET2.0分页控件 . 版本号:2.0.0.1 Framework:.net2.0 分页方式:PostBack .URL (暂时没有实现URL的分页方式) webform  (b/s) 支持多种数据库,分页算法,提取数据的方式都可以替换.     分页,自从做b/s的项目起,就和分页打起了交到,一开始使用UserControl来做,很粗糙,也没有什么性能可言.但是分页又是不可避免的,一次提取全部的数据,咱用的资源太多,吃不消.于是乎就在不断的想

【开源】QuickPager ASP.NET2.0分页控件V2.0.0.3 【增加了使用说明】

================================ 欢迎转载,但是请注明出处.本文出自博客园 .谢谢合作! ================================   最新版本:V2.0.0.7 .http://www.cnblogs.com/jyk/archive/2008/07/28/1255101.html 下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html   ================

ASP.NET2.0 新增控件-BulletedList

asp.net|控件 BulletedList是一个让你轻松在页面上显示项目符号和编号格式(Bulledted List)的控件.对于ASP.NET 1.x里要动态显示Bulledted List时,要么自己利用HTML的<ol>或<ul>元素构造,要么就是"杀鸡用牛刀"的动用Repeater来显示.前者过于死板,后者过于overkill,也许微软听到这种声音,于是ASP.NET 2.0总算搞了个BulletedList出来了.这控件虽然给人不太多注意,但却看得

ASP.NET2.0 新增控件-ImageMap

asp.net|控件 ImageMap控件是一个让你可以在图片上定义热点(HotSpot)区域的服务器控件.用户可以通过点击这些热点区域进行回发(PostBack)操作或者定向(Navigate)到某个URL位址.该控件一般用在需要对某张图片的局部范围进行互动操作时,其主要属性有HotSpotMode.HotSpots和主要操作Click.?        HotSpotMode:顾名思义为热点模式,对应枚举类型System.Web.UI.WebControls.HotSpotMode.其选项及

【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。

分页控件的源代码下载网址:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html (在网页的下面) 下载文件里面由一个测试网页:http://localhost:5561/test/Testlist.aspx?fid=1 请注意后面的参数. 在webconfig里面修改连接字符串和数据库类型.DataType ---- 1: MS SQL ;2:Oledb:3:ODBC.   <appSettings>    <add key

ASP.NET2.0登陆控件的使用(常见的三种方法)

asp.net|控件   这里以CreateUserWizard 为例说明注册用户向导的常规使用1)使用默认的向导控件功能  默认的注册向导的使用向导的简单,简单到如下只要一句话代码的地步:  <asp:CreateUserWizard ID="CreateUserWizardControl" runat="server"/>无需要额外的代码就能够完成用户的注册,将注册的信息写入ASPNETDB.MDF数据库. 2)使用默认ID  一些不安分的用户开始不

ASP.NET2.0登陆控件常见的三种使用方法

这里以CreateUserWizard 为例说明注册用户向导的常规使用 1)使用默认的向导控件功能 默认的注册向导的使用向导的简单,简单到如下只要一句话代码的地步: <asp:CreateUserWizard ID="CreateUserWizardControl" runat="server"/> 无需要额外的代码就能够完成用户的注册,将注册的信息写入ASPNETDB.MDF 数据库. 2)使用默认ID 一些不安分的用户开始不满足上面的功能:虽然简单,

【开源】QuickPager ASP.NET2.0分页控件V2.0.0.7 增加了一个js函数的分页方式。

       昨天在csdn上看到一个人提出来了一种分页的需求,大致是分页控件只负责绘制总页数.上一页.下一页等信息,然后在用户翻页的时候可以触发一个js函数,然后自己实现这个js函数.并不需要提交表单,他想用ajax的方式来获取数据,但是又不想使用微软的ajax.        大概的需求就是这样的(至少我的理解是这样的),不知道吴旗娃的分页控件是不是支持这种需求.不过我的分页控件还没有涉及到ajax,原因是我还不会用ajax,那么是不是可以先实现这种需求呢?想了一下,比较简单,只要继承Pag