跨页面访问 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日:首次发布


