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的控件让用户
格式化文本,并在输入完毕后,返回原注册页面。关于这种情况,以后会介绍。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器