跨页面访问ViewState仅仅适用于通过Post方法或者Server.Transfer方法从一个页面重定向到另一个页面的情况,如果你使用Response.redirect方法将无法实现跨页面访问ViewState.

通过下面的一个例子来演示扩页面访问ViewState

我们创建两个页面,分别为:

1、ViewStateContainer.aspx:这个页面用来设置ViewState的值,并传递到另一个页面.

2、AccessViewState.aspx :这个页面用来访问ViewStateContainer.aspx页面传过来的ViewState对象.

ViewStateContainer.aspx页面代码如下:

public partial class ViewStateContainer : System.Web.UI.Page
{
     protected void Page_Load(object sender, EventArgs e)
     {

          ViewState["Page1"] = "Page1 ViewState";

           Server.Transfer("AccessViewState.aspx");

      }

      public StateBag ReturnViewState()

      {

            return ViewState;

      }

}

在Page_Load事件中设置了一个ViewState值,并重定向到AcessViewState.aspx页面,这个页面有一个ReturnViewState方法,返回ViewState对象,返回的类型为StateBag

StateBag类:这个类主要用来存储所有HTML和服务端控件的结构,它保存了控件的attribute/value的组合信息,并能在页面请求OnInit方法之后更新控件或页面的状态

现在看一下AccessViewState.aspx页面代码:

public partial class AccessViewState : System.Web.UI.Page
{
    private StateBag PreviousPageViewState
    {
        get { 
             StateBag returnValue = null;
             if (PreviousPage != null)
             {
                Object objPreviousPage = (Object)PreviousPage;
                MethodInfo objMethod = objPreviousPage.GetType().GetMethod ("ReturnViewState");
                return (StateBag)objMethod.Invoke(objPreviousPage, null);
             }
             return returnValue;
         }
   }

  protected void Page_Load(object sender, EventArgs e)
  {
       if (PreviousPage != null)
      {
           if (PreviousPageViewState != null)
           {
               Label1.Text = PreviousPageViewState["Page1"].ToString();
           }
      }
   }
}

通过Server.Transfer或者Post方法跳转的页面,可以通过PreviousPage属性获得前一页面的控件

在这个页面我们创建了PreviousPageViewState,通过反射的方法,执行前一页面的ReturnViewState方法,获得前一页面的ViewState(StateBag类型),这样就可以访问前一页面的所有ViewState对象了.

文章出自:http://www.codeproject.com/KB/aspnet/AccessViewState.aspx