我所知道的:
ViewState用来保存往返页面和控制值,从而可以使新请求的页面恢复为提交页面的状态。
ViewState以加密方式保存在隐藏字段__ViewState__中但是我有很大的疑问:
1>为什么TextBox的Color,MaxLength等属性也保存在ViewState中?(反编译可以看到)
2>TextBox的Text值本来就会回传到服务器,还为什么要保存在ViewState中?(类似有Select的value等)
3>由于1>2>,ViewSate到底有什么用?200分求答案。可以比较详细的说明ViewState的用法的话,可以加分。代码只要说明问题即可,不要复制和粘贴一大堆。

解决方案 »

  1.   

    先回答一个问题
    (1)Color,MaxLength等属性为什么要保存在ViewState中?//自定义控件
    public class  SampleControl : WebControl{
            [Bindable(true)]
            [Category("Appearance")]
            [DefaultValue("")]
            [Localizable(true)]
            public string Text
            {
                get;set;
            }        #endregion        protected override void Render(HtmlTextWriter writer)
            {
                writer.Write(Text);
            }
    }
        }protected void Button2_Click(object sender, EventArgs e)
            {
                this.SampleControl1.Text = "btn1";
            }        protected void Button3_Click(object sender, EventArgs e)
            {            
            }如果你先点Button2,页面展示btn1。然后你再你认为你点Button3的时候,页面上展示的控件会显示什么呢?ViewState的作用就是用来保持这个btn1的。当前没有使用ViewState保持Text的值,所以页面不会保持btn1
      

  2.   

    可能我理解的比较浅显:ViewState用来保存页面状态,就是说提交之后我们还可以看到文本框里面的内容就是ViewState保存的功劳。ViewState只维护当前页面的状态,不同页面之间不能共享,Session可以。ViewState你可以理解为一个隐藏控件。
      

  3.   

    state嘛,当然是用来保存状态的。 主要配合postback功能,有些控件使用自动post功能,其他控件在post后在显示时要保留之前的状态(显示的数据、用户输入的数据)就是靠viewstate了。你也可以编程使用viewstate, post前放些数据,post后读取。page,服务器端控件都有自己的viewstate.
      

  4.   

    第二个问题:TextBox的Text值的确保存在ViewState中。但是也同时保存在“控件状态”中。如下:   protected virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            base.ValidateEvent(postDataKey);
            string text = this.Text;
            string str2 = postCollection[postDataKey];
            if (!this.ReadOnly && !text.Equals(str2, StringComparison.Ordinal))
            {
                this.Text = str2;
                return true;
            }
            return false;
        }
      

  5.   

    如果Color,MaxLength等不保存在控件状态中的话,如果服务器端对其进行了更改,这个更改是无法保存的。虽然当前的页面对象的状态是正确的,但是再次post的时候,页面对象的状态会丢失。
      

  6.   

    你也可以禁用viewstate,这样可以减少交互数据量,但是你要自己处理所有传递参数了。
      

  7.   

    Web窗体是无状态的。要保留某些状态必须用到ASP.NET的内置对象。在ASP.NET页面间传递数据的方式有几种:1.传递数据给页面本身
        使用ViewState对象。
    2.传递给当前页面链接到的另一页面
        使用Request.QueryString
    3.传递给没有直接关联的页面
        使用Session、Cookie或全局变量。如上,ViewState用来给页面本身传递数据用。比如我们有一个变量,值为:100,然后页面放一个按钮,每点一次给这个变量加1,然后显示到一个TextBox中,通常应该是这样的代码:   private int id;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                id = 100;
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            id++;
            TextBox1.Text = id.ToString();
        }
    但是,实际运行一下会发现结果不是我们预想的。这是因为:当页面提交或刷新后,由于Web页面的无状态性,这个变量的值会消失,因此通常把它保存到ViewState中,在刷新后从ViewState中取回该值。改用下面的代码:    private int id;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (ViewState["id"]==null)
            {
                id = 100;
                ViewState["id"] = id;
            }
            else
            {
                id =(int) ViewState["id"];
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            id++;
            TextBox1.Text = id.ToString();
            ViewState["id"] = id;
        }
    就可以得到我们想要的结果。