收藏本站 收藏本站
积木网首页 - 软件测试 - 常用手册 - 站长工具 - 技术社区
积木学院 > 程序开发 > C# > 正文

ASP.NET2.0 HiddenField控件(2)

来源:互联摘选 日期:2008-12-03 07:07
     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技术社区,这里应该有您想要的!
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP备05050695号