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