65.9K
CodeProject 正在变化。 阅读更多。
Home

跨页面访问 ViewState

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (15投票s)

2009年6月30日

CPOL

3分钟阅读

viewsIcon

109819

downloadIcon

908

本文演示了我们如何跨页面共享 ViewState

引言

在我开始这篇文章之前,我想问你一个问题。是否可以在另一个页面上访问一个页面的 ViewState 变量? 我不知道你的答案是什么。 好吧,坦率地说,在写这篇文章之前我的答案也是“否”,因为据说 ViewState 是页面特定的。

背景

ViewState 是一个非常容易被误解的概念。 据说 ViewState 是页面特定的; 这意味着它仅在创建它的同一页面上可用。 一旦你重定向到另一个页面,之前页面的 viewstate 就无法再访问。 但这并非事实。

Using the Code

是的,我们可以跨页面访问 viewstate 变量。 只有使用 跨页面回发Server.transfer 将用户重定向到其他页面时,才有可能。 如果使用 Response.redirect,则无法跨页面访问 ViewState

在继续阅读本文之前,请阅读这些关于 跨页面回发Server.transfer 的文章。

好的,现在一切就绪... 我将使用我创建的演示来演示这一点。 您可以从本文顶部的链接下载演示。

我创建了两个*.aspx页面,命名为

  1. ViewStateContainer.aspx:此页面设置 ViewState 变量,并使用 Server.transfer 将用户转移到另一个页面。
  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 变量,并使用 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 PageReturnViewState() 方法。

Page_Load 事件中,我能够访问 ViewStateContainer PageViewState 变量。 您可以访问在 ViewStateContainer Page 中设置的所有 viewstate 变量。

享受。

历史

  • 2009年6月30日:首次发布
© . All rights reserved.