科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET 2.0中使用HiddenField控件

ASP.NET 2.0中使用HiddenField控件

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据。

作者:佚名 来源:动态网站制作指南 2007年11月6日

关键字: Windows

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章