跨页面访问 ViewState






4.70/5 (15投票s)
本文演示了我们如何跨页面共享 ViewState
引言
在我开始这篇文章之前,我想问你一个问题。是否可以在另一个页面上访问一个页面的 ViewState
变量? 我不知道你的答案是什么。 好吧,坦率地说,在写这篇文章之前我的答案也是“否”,因为据说 ViewState
是页面特定的。
背景
ViewState 是一个非常容易被误解的概念。 据说 ViewState
是页面特定的; 这意味着它仅在创建它的同一页面上可用。 一旦你重定向到另一个页面,之前页面的 viewstate
就无法再访问。 但这并非事实。
Using the Code
是的,我们可以跨页面访问 viewstate
变量。 只有使用 跨页面回发 或 Server.transfer 将用户重定向到其他页面时,才有可能。 如果使用 Response.redirect
,则无法跨页面访问 ViewState
。
在继续阅读本文之前,请阅读这些关于 跨页面回发 和 Server.transfer 的文章。
好的,现在一切就绪... 我将使用我创建的演示来演示这一点。 您可以从本文顶部的链接下载演示。
我创建了两个*.aspx页面,命名为
- ViewStateContainer.aspx:此页面设置
ViewState
变量,并使用Server.transfer
将用户转移到另一个页面。 - 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
变量,并使用 Server.transfer() 方法将用户转移到 AccessViewState.aspx 页面。
此页面还包含一个 ReturnViewState()
方法,该方法实际上将此页面的 ViewState
返回给调用函数。 该方法的返回类型是 StateBag 类。
StateBag
类:此类是所有 HTML 和 Web 服务器控件的主要存储机制。 它将属性/值对存储为与控件关联的 string
。 它仅在为页面请求执行 OnInit
方法后才跟踪对这些属性的更改,并将更改保存到页面或控件的 viewstate
中。
现在让我们看看 AccessViewState.aspx Page
代码
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 或 跨页面回发 时,我们可以通过 PreviousPage 属性获取上一个页面对象。 使用 PreviousPage,我们可以找到上一个页面的控件。 例如,可以访问当前页面中 ViewStateContainer
页面中的 Label
控件。
查看代码,我在此页面中创建了一个 PreviousPageViewState
属性,该属性返回上一页面的 ViewState
。 它首先检查 PreviousPage
是否为 null
,如果不是 null
,则创建上一个页面的对象。 现在使用 Reflection,我们可以调用上一个类的方法。 使用 MethodInfo 类,我调用了 ViewStateContainer Page
的 ReturnViewState()
方法。
在 Page_Load
事件中,我能够访问 ViewStateContainer Page
的 ViewState
变量。 您可以访问在 ViewStateContainer Page
中设置的所有 viewstate
变量。
享受。
历史
- 2009年6月30日:首次发布