ASP.NET2.0 HiddenField控件

原创 2007年10月09日 13:39:00
 

为了帮助使用《ASP.NET技术详解与应用实例》的读者平稳过渡到ASP.NET2.0,天天推出ASP.NET2.0系列,本系列教程编排基本上和该书内容一致,供使用《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"
    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";    }
在这个例子里,我们想要的结果是:当用户单击按钮时,通过按钮的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事件呢?

     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>
    

 

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

 

隐藏控件--HiddenField控件

百度查的结果:       HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据。也许这个时候应该有这么一个疑问,为什么有了V...
  • hejingyuan6
  • hejingyuan6
  • 2013年11月13日 23:09
  • 8227

HiddenField控件的使用

ASP.NET2.0 HiddenField控件(1)2007-05-12 23:18HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不...
  • orichisonic
  • orichisonic
  • 2015年11月06日 10:44
  • 386

ASP.NET2.0服务器控件之类型转换器

1. 类型转换器基本概念   类型转换器是自定义服务器控件的辅助性功能实现。它主要用于执行从字符串表示形式到指定类型之间的双向转换。例如,以文本形式表示属性值,将用户输入的文本转换为相应数据类型...
  • my98800
  • my98800
  • 2017年12月29日 08:15
  • 50

ASP.NET2.0服务器控件之类型化样式属性

实现类型化样式属性的方法 继承自Style类的类称为类型化样式。Style类可以由控件开发人员来扩展,创建一个自定义类型化样式,它重写或者添加Style类的属性。服务器 控件也可以把自定义类型化...
  • my98800
  • my98800
  • 2017年12月29日 08:10
  • 72

ASP.NET2.0服务器控件之自定义状态管理

在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性。本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理...
  • u011877729
  • u011877729
  • 2013年08月29日 19:25
  • 278

ASP.NET2.0服务器控件开发之实现事件

前面几篇文章讲解了与利用ASP.NET 2.0技术创建自定义服务器控件属性有关的内容。从本文开始,包括随后的几篇文章将探讨创建自定义服务器控件事件的方法。本文重点对实现控件事件的基本概念进行介绍,这些...
  • u011877729
  • u011877729
  • 2013年08月29日 19:28
  • 284

ASP.NET2.0服务器控件之自定义状态管理

自定义视图状态管理   在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String、Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能。然而,如果开发人员在...
  • my98800
  • my98800
  • 2017年12月29日 08:14
  • 64

【ASP.NET】Win7下ASP.NET的配置,Helloworld,发布网站

Win7下配置ASP.NET环境与配置ASP(VbScript)极其类似,毕竟大家都是微软的产品,在2003年ASP.NET诞生之前,用Windows做服务器来写网页的,几乎清一色都是ASP。 其实...
  • yongh701
  • yongh701
  • 2016年01月07日 17:54
  • 1701

ASP.NET2.0服务器控件之捕获回传事件

上一篇文章介绍了实现自定义服务器控件事件的基本概念。本文将通过典型示例讲解捕获回传事件的实现方法。   1. 实现捕获回传事件   如果服务器控件需要捕获来自客户端的回传事件,并想为该回传...
  • u011877729
  • u011877729
  • 2013年08月29日 19:35
  • 344

ASP.NET2.0 菜单控件menu的动态静态用法

利用 ASP.NET Menu 控件,可以开发 ASP.NET 网页的静态和动态显示菜单。您可以在 Menu 控件中直接配置其内容,也可通过将该控件绑定到数据源的方式来指定其内容。 无需编写任何...
  • GoodShot
  • GoodShot
  • 2013年09月18日 12:03
  • 1589
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET2.0 HiddenField控件
举报原因:
原因补充:

(最多只允许输入30个字)