当前位置:编程学习 > C#/ASP.NET >>

关于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,但并不回传给服务器? --------------------编程问答--------------------
引用楼主 njnuxj 的回复:
第一次单击


单击多几次试试。 --------------------编程问答-------------------- 呃。。。我没说明白啊
第一个Label的EnableViewState已经给我设为false了,它本来就不应该加1的,不管单击多少次
引用 1 楼 karascanvas 的回复:
引用楼主 njnuxj 的回复:

第一次单击



单击多几次试试。
--------------------编程问答-------------------- 开发人员对ViewState(还包括Cache,Session等)机制的不了解,而导致其在开发过程中滥用。比如误认为ViewState是存储在客户端(表面看是在页面中)而不是服务端,而把ViewState当做一个海量容器来用,甚至把页面上的业务列表数据都缓存到ViewState中,最终导致页面流量庞大,打开页面速度非常慢却找不到原因。简单地说ViewState的工作流程是这样的:每次提交时,它都会以客户端到服务端的形式来回传递一次,当处理完成后,最后会以处理后的新结果作为新的ViewState存储到页面中的隐藏字段,并与页面内容一起返回到客户端。 --------------------编程问答--------------------
        //label1禁用了视图,那么每次页面加载时它的值就是你设的值0,然后执行单击事件+1 = 1
        //你一直单击就一直是1
        //你可以再设个其它按钮,啥也不写,点击试试,值会变为0 --------------------编程问答-------------------- ViewState就是为了保存状态的asp.net中的一个新概念。 --------------------编程问答-------------------- 嗯,这些我都在书上看到了啊,我写的例子也是书上的,就是不明白第一次单击按钮的时候,为什么第一个Label也会加1呢?它不是应该一直不变么?
引用 3 楼 qingfeng_wu 的回复:
开发人员对ViewState(还包括Cache,Session等)机制的不了解,而导致其在开发过程中滥用。比如误认为ViewState是存储在客户端(表面看是在页面中)而不是服务端,而把ViewState当做一个海量容器来用,甚至把页面上的业务列表数据都缓存到ViewState中,最终导致页面流量庞大,打开页面速度非常慢却找不到原因。简单地说ViewState的工作流程是这样的:每次提交时,它都……
--------------------编程问答-------------------- 晕 楼主题目有歧义啊  还以为是页面级的ViewState呢 --------------------编程问答-------------------- Label1.Text的值设置为0,加1是正确的 --------------------编程问答--------------------
引用 2 楼 njnuxj 的回复:
呃。。。我没说明白啊
第一个Label的EnableViewState已经给我设为false了,它本来就不应该加1的,不管单击多少次
引用 1 楼 karascanvas 的回复:

引用楼主 njnuxj 的回复:

第一次单击



单击多几次试试。


没单击之前是0, 第一次单击以后值是0+1,第二次以后还是0+1,因为它有个初始值是0,但运算以后结果没有被用viewstate来保存。 --------------------编程问答-------------------- 嗯,再加个按钮,确实又会变回0.
那么第一个Label的第一次加1其实并没有回传给服务器,仅仅是客户端加1,是吧?
引用 4 楼 sprc_lcl 的回复:
        //label1禁用了视图,那么每次页面加载时它的值就是你设的值0,然后执行单击事件+1 = 1
        //你一直单击就一直是1
        //你可以再设个其它按钮,啥也不写,点击试试,值会变为0
--------------------编程问答-------------------- 好吧,算是明白了,谢谢啦~~~
引用 9 楼 karascanvas 的回复:
引用 2 楼 njnuxj 的回复:

呃。。。我没说明白啊
第一个Label的EnableViewState已经给我设为false了,它本来就不应该加1的,不管单击多少次
引用 1 楼 karascanvas 的回复:

引用楼主 njnuxj 的回复:

第一次单击



单击多几次试试。


没单击之前是0, 第一次单击以后值是0+1,第二次以后还是0+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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,