C# viewstate变量是否始终可用?

C# viewstate变量是否始终可用?,c#,asp.net,.net,C#,Asp.net,.net,我在想一个定制的ViewState变量是否在每次页面访问(相同的浏览器会话)(如session但在客户端)时始终可用,还是仅在页面回发时可用?我知道这是客户端数据,总是用来自服务器的请求数据包和响应数据包进行封装 我正在测试这个,我做了以下工作: 在Home.aspx上: protected void Page_Load(object sender, EventArgs e) { ViewState["test"] = "test1"; } protected void Button1_

我在想一个定制的
ViewState
变量是否在每次页面访问(相同的浏览器会话)(如
session
但在客户端)时始终可用,还是仅在页面回发时可用?我知道这是客户端数据,总是用来自服务器的
请求
数据包和
响应
数据包进行封装

我正在测试这个,我做了以下工作:

在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");
}
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上:

protected void Page_Load(object sender, EventArgs e)
{
    string test = ViewState["test"].ToString();
}
但是我得到了
NullReferenceException
。因此,这意味着
ViewState[“test”]
不存在,因为
ViewState
是全新的并重新生成的。因此,我的结论是,只有在执行表单回发时,才可以使用
ViewState
变量(但事实上,表单回发后总是进行重定向,所以我不能总是使用ViewState…)


我的观点正确吗?

您在这里所做的是偶然发现了ASP.NET Web表单中的一个基本理解点,以及它是如何将HTTP的无状态本质抽象出来的

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

  • 会话存储在服务器端,当浏览器返回一个可识别的cookie时生成会话
  • Viewstate完全存储在客户端隐藏的
    标记中,这意味着每次回发时都会重新提交这些标记

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

您在这里所做的是偶然发现ASP.NET Web表单中的一个基本理解点,以及它如何将HTTP的无状态本质抽象出来

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

  • 会话存储在服务器端,当浏览器返回一个可识别的cookie时生成会话
  • Viewstate完全存储在客户端隐藏的
    标记中,这意味着每次回发时都会重新提交这些标记

正如您所经历的,会话可以跨页面实时访问,而Viewstate仅在发布到同一页面时可用。

Viewstate可以使用不同(或自定义)提供程序以不同方式配置,也可以完全禁用。但是,默认的提供程序是它是一个表单字段,所以是:在默认配置情况下,它将只存在于POST上,而不存在于GET上。传输操作本质上类似于GET

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


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

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

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


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

使用Page\u PreRender,Page\u Load在viewstate处于可用状态IIRC之前。

使用Page\u PreRender,Page\u Load在viewstate处于可用状态IIRC之前。

如果与url和
true
参数一起使用,则它将保留查询字符串和表单集合。但您仍然无法直接从第2页访问ViewState。下面是一种访问视图状态的方法

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");
}
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();
        }
    }
}
如果与url和
true
参数一起使用,则它将保留查询字符串和表单集合。但您仍然无法直接从第2页访问ViewState。下面是一种访问视图状态的方法

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

您不正确,
ViewState
已加载到
Page\u Load
您不正确,
ViewState
已加载到
Page\u Load