关于ViewState
前台:<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="0" EnableViewState="false"></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text="0"></asp:Label>
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>
后台:
namespace _1125
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = (Int32.Parse(Label1.Text) + 1).ToString();
Label2.Text = (Int32.Parse(Label2.Text) + 1).ToString();
}
}
}
对于第一个Label,我已经禁用视图了,为什么第一次单击按钮的时候,它的值还是会加1呢?是不是单击按钮都只是在0上加1,但并不回传给服务器? --------------------编程问答--------------------
单击多几次试试。 --------------------编程问答-------------------- 呃。。。我没说明白啊
第一个Label的EnableViewState已经给我设为false了,它本来就不应该加1的,不管单击多少次
--------------------编程问答-------------------- 开发人员对ViewState(还包括Cache,Session等)机制的不了解,而导致其在开发过程中滥用。比如误认为ViewState是存储在客户端(表面看是在页面中)而不是服务端,而把ViewState当做一个海量容器来用,甚至把页面上的业务列表数据都缓存到ViewState中,最终导致页面流量庞大,打开页面速度非常慢却找不到原因。简单地说ViewState的工作流程是这样的:每次提交时,它都会以客户端到服务端的形式来回传递一次,当处理完成后,最后会以处理后的新结果作为新的ViewState存储到页面中的隐藏字段,并与页面内容一起返回到客户端。 --------------------编程问答--------------------
//label1禁用了视图,那么每次页面加载时它的值就是你设的值0,然后执行单击事件+1 = 1
//你一直单击就一直是1
//你可以再设个其它按钮,啥也不写,点击试试,值会变为0 --------------------编程问答-------------------- ViewState就是为了保存状态的asp.net中的一个新概念。 --------------------编程问答-------------------- 嗯,这些我都在书上看到了啊,我写的例子也是书上的,就是不明白第一次单击按钮的时候,为什么第一个Label也会加1呢?它不是应该一直不变么? --------------------编程问答-------------------- 晕 楼主题目有歧义啊 还以为是页面级的ViewState呢 --------------------编程问答-------------------- Label1.Text的值设置为0,加1是正确的 --------------------编程问答--------------------
没单击之前是0, 第一次单击以后值是0+1,第二次以后还是0+1,因为它有个初始值是0,但运算以后结果没有被用viewstate来保存。 --------------------编程问答-------------------- 嗯,再加个按钮,确实又会变回0.
那么第一个Label的第一次加1其实并没有回传给服务器,仅仅是客户端加1,是吧? --------------------编程问答-------------------- 好吧,算是明白了,谢谢啦~~~ --------------------编程问答-------------------- 和你说得通俗一点,就是页面肯定会记录一次,但这一次请求完,viewstate这个状态的请求结果会自动销毁,如果你说为什么要加1,那是你程序问题。思路不清晰,或者你根本就不了解原理! --------------------编程问答-------------------- Text="0",这个事件发生在Page_Load之前,虽然它是存在ViewState中了,但这时的ViewState只是一个存在内存中的键值对,直到SaveViewState事件发生的时候,才会序列化到内存当中,而SaveViewState事件要发生在Button_Click之后,这个事件的顺序楼主可以打开页面的Trace="true"来观察。
protected void Button1_Click(object sender, EventArgs e)
{
这个事件发生在Page_Load之后。
所以
Label1.Text = (Int32.Parse(Label1.Text) + 1).ToString();
实际上就是
Label1.Text = (0 + 1).ToString();
--------------------编程问答-------------------- 更正一下:直到SaveViewState事件发生的时候,才会序列化到内存当中 ->直到SaveViewState事件发生的时候,才会序列化到页面的hidden当中 --------------------编程问答-------------------- 恩。。第一次的确会加。。再一次呢?
关闭viewstate是指不跟踪,没有回发回去,但是初始状态还是记录有的,就是记录没有改变。
比如,原来是0就永远只记得是0 --------------------编程问答-------------------- 你可以查看下 page 生命周期
补充:.NET技术 , ASP.NET