我在考虑自定义的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 ......)。
我的观点是对的吗?
答案 0 :(得分:3)
ViewState可以通过不同的方式配置,使用不同的(或自定义的)提供程序,也可以完全禁用。但是,默认提供程序是它是一个表单字段,所以是的:在默认配置的情况下,它只存在于POST上,并且不存在于得到。传输操作基本上就像GET一样。
如果您需要不相关页面之间的数据,但与用户相关 - 请使用会话状态或基于cookie的内容。
在不相关的新闻中:视野状态在很多方面都非常可怕 - 想想小猫!
答案 1 :(得分:1)
你在这里所做的是偶然发现ASP.NET Web Forms中的一个基本理解点,以及它如何将远离你的HTTP的无状态特性抽象出来。
Session 变量和 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之前。