HiddenField控件的使用

  • 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"
        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属性,这和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="单击按钮" onclick="Button1_Click" 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" OnClick="Button1_Click" 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" OnClick="Button1_Click" Text="Button" />

    </form>

</body>

</html>


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

 

posted on 2012-02-07 14:30  zhangtao1212  阅读(306)  评论(0编辑  收藏  举报

导航