跨页面访问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