View State的理解(如有误,欢迎拍砖)

View State是Asp.net的专有的,也不是什么高深的东西,让我们来慢慢理解它。。

ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。

当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的.

ViewState是页面级的,不能夸页面。

我们大家一起来个View state的原理图:

下面举个例子一个TextBox和Label的服务控件使用ViewState的区别。

 我给这两个控件一个初始值,让它们实现自增效果,从1开始。。代码如下:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
             //给两个控件一个初始值
            this.Label1.Text ="1";  
            this.Textbox1.Text = "1";
        }  
    }
    //label自增按钮
    protected void Button1_Click(object sender, EventArgs e)
    {
        int labNum = Convert.ToInt32(Label1.Text);
        labNum++;
        Label1.Text = labNum.ToString();
    }
    //textbox自增按钮
    protected void Button2_Click(object sender, EventArgs e)
    {
        int txtNum = Convert.ToInt32(Textbox1.Text);
        txtNum++;
        Textbox1.Text = txtNum.ToString();
    }
}
我分别给它们自增到3,

大家一起来看看HTML代码:

<body>
    <form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA5NTQxNTQ2MQ9kFgICAw9kFgICAQ8PFgIeBFRleHQFATNkZGQqRxduw0hC4GvzoslavchpURXGzzGcLaEo4EP+x+Irww==" />
</div>

<div class="aspNetHidden">

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAK4oIMuAoznisYGAozSsusGArursYYIpmReKswj5pGVmWNUMMSMDhFZEGWMxdIKTRb04ISEk/U=" />
</div>
    <div>
   <span id="Label1">3</span>
        <input type="submit" name="Button1" value="lab增长" id="Button1" />
    <br />
    <input name="Textbox1" type="text" value="3" id="Textbox1" />
        <input type="submit" name="Button2" value="txt增长" id="Button2" />

大家可以清楚看到label控件生成HTML代码是: <span id="Label1">3</span>是这样。
textbox生成HTML代码是: <input name="Textbox1" type="text" value="3" id="Textbox1" />是这样。

这都是ViewState默认为“true”的结果,那大家想想,如果我在页面使用了EnableViewState="false"大家想想结果

当我再次分别点自增按钮的时候,textbox继续增长下去,而Label控件就报错了,这说明什么。。

大家都会说我禁用了ViewState,那为什么textbox还会增长,这里可以说明,ViewState机制对TextBox控件无效。

同时
Checkbox
Checkbox List
RadioButtonList
上面控件的状态通过IPostBackEventHandler 和 IPostBackDataHandler接口处理,而不是ViewState的机制,所以EnableViewState也没有效果。

这是我们的理解,希望对大家有帮助,也欢迎大家多提出你宝贵的意见,谢谢。

 

 

posted @ 2012-09-11 22:59  梦想在键盘上绽放  阅读(684)  评论(0)    收藏  举报