0

我在考虑是否在每次页面访问(相同的浏览器会话)(如但客户端)时ViewState始终可用自定义变量还是仅在页面回发时可用?Session我知道这是客户端数据,始终与Request数据包和Response来自服务器的数据包一起封装。

我现在正在测试这个,我做了以下事情:

在 Home.aspx 上:

protected void Page_Load(object sender, EventArgs e)
{
    ViewState["test"] = "test1";
}
protected void Button1_Click(object sender, EventArgs e)
{
    string test = ViewState["test"].ToString();

    Server.Transfer("Default.aspx");
}

在 Default.aspx 上:

protected void Page_Load(object sender, EventArgs e)
{
    string test = ViewState["test"].ToString();
}

但我明白了NullReferenceException。所以这意味着它ViewState["test"]不存在,因为它ViewState是全新的和再生的。所以我的结论是你ViewState只能在表单回发时使用变量(但事实上,你总是在表单回发之后进行重定向,所以我不能总是使用 ViewState ......)。

我的观点对吗?

4

4 回答 4

3

ViewState 可以通过不同的(或自定义的)提供程序以不同的方式进行配置,或者可以完全禁用。但是,默认提供者是一个表单字段,所以是的:在默认配置情况下,它只会存在于 POST 中,而不会存在于 GET 中。传输本质上类似于 GET。

如果您需要不相关页面之间的数据,但与用户相关 - 使用会话状态或基于 cookie 的东西。

在不相关的新闻中:视图状态在很多方面都非常可怕 - 想想小猫!

于 2012-06-05T12:53:51.640 回答
1

您在这里所做的是偶然发现了 ASP.NET Web 窗体中的基本理解点之一,以及它如何将 HTTP 的无状态特性从您身上抽象出来。

Session变量和Viewstate的区别很简单:

  • 会话存储在服务器端,并在浏览器返回可识别的 cookie 时生成
  • Viewstate 完全存储在客户端隐藏<input>标签中,这意味着它们在每次回发时都是新鲜提交的

正如您所经历的,Session 可以跨页面存在,而 Viewstate 仅在发布到同一页面时可用。

于 2012-06-05T12:53:18.627 回答
1

如果您使用HttpServerUtility.Transfer Method (String, Boolean) url 和true参数,那么它将保留 QueryString 和 Form 集合。但是您仍然不能直接从第二页访问 ViewState。这是一种访问视图状态的方法。

主页.aspx:

protected void Page_Load(object sender, EventArgs e)
{
    ViewState["test"] = "test1";
}

protected void Button1_Click(object sender, EventArgs e)
{
    Server.Transfer("Default.aspx", true);
}

// adding this method to return view state

public StateBag ReturnViewState()
{
    return ViewState;
}

Default.aspx:这里使用 PreviousPage 我们可以调用该页面上的方法并获取视图状态

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)
        {
            var text = PreviousPageViewState["test"].ToString();
        }
    }
}
于 2012-06-05T13:31:40.377 回答
0

使用 Page_PreRender,Page_Load 在视图状态处于可用状态 IIRC 之前。

于 2012-06-05T12:54:19.520 回答