viewstate变量始终可用?

时间:2012-06-05 12:47:55

标签: c# asp.net .net

我在考虑自定义的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 个答案:

答案 0 :(得分:3)

ViewState可以通过不同的方式配置,使用不同的(或自定义的)提供程序,也可以完全禁用。但是,默认提供程序是它是一个表单字段,所以是的:在默认配置的情况下,它只存在于POST上,并且不存在于得到。传输操作基本上就像GET一样。

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

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

答案 1 :(得分:1)

你在这里所做的是偶然发现ASP.NET Web Forms中的一个基本理解点,以及它如何将远离你的HTTP的无状态特性抽象出来。

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

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

如您所见,会话可以跨页面生效,而Viewstate仅在发布到同一页面时可用。

答案 2 :(得分:1)

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

Home.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();
        }
    }
}

答案 3 :(得分:0)

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