"the reference to the object" 的逻辑如何与 ViewState 一起工作?
How does the logic for "the reference to the object" work with ViewState?
我将列表存储到 ViewState。每当我对列表进行更改时,ViewState 都会自动更新。当我查看 Whosebug 中的几个相关帖子时,我了解到这是因为 ViewState 存储了对 List 对象的引用。
不过,我想了解更多详情。我虽然存储在 ViewState 中的信息通过 PostBacks 传播。然后,整个列表应该被序列化并存储在隐藏字段中,对吗?如果它存储了对List对象的引用,那么该对象在Server内存中的生命周期是多少?每次服务器收到请求时是否重新创建?
谁能为我解释一下这个机制?
让我举个简单的例子:
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<string> myList = new List<string> { "a", "b", "c" };
Response.Write(string.Join(";", myList.ToArray()) + "<br>");
ViewState["myList"] = myList;
myList.Add("d");
List<string> myListSavedInViewstate = (List<string>)ViewState["myList"];
Response.Write(string.Join(";", myListSavedInViewstate.ToArray()) + "<br>");
myListSavedInViewstate.Add("e");
Response.Write(string.Join(";", myList.ToArray()) + "<br>");
Response.Write(myList.GetHashCode() + "<br>");
Response.Write(myListSavedInViewstate.GetHashCode() + "<br>");
}
}
输出为:
a;b;c
a;b;c;d
a;b;c;d;e
34781257
34781257
所以基本上是的,Viewstate 在整个页面生命周期中保留一个引用而不是对象(引用类型)的副本。但是,一旦请求结束,Viewstate 就会在隐藏字段中序列化并返回给客户端,并且 Viewstate 实例会被删除。当回发发生时,视图状态被反序列化并重新创建。然而,重新创建的视图状态实例只是它在页面生命周期执行期间用来保存引用的所有对象的浅表副本。这就是为什么在视图状态中允许的所有 类 都必须实现 ISerializable 接口(或必须具有 Serializable 属性)。
然而,这只是冰山一角 ;) 如果您想阅读有关该主题的更多内容,这里有一篇关于视图状态的非常好的文章。
http://weblogs.asp.net/infinitiesloop/Truly-Understanding-Viewstate
我将列表存储到 ViewState。每当我对列表进行更改时,ViewState 都会自动更新。当我查看 Whosebug 中的几个相关帖子时,我了解到这是因为 ViewState 存储了对 List 对象的引用。
不过,我想了解更多详情。我虽然存储在 ViewState 中的信息通过 PostBacks 传播。然后,整个列表应该被序列化并存储在隐藏字段中,对吗?如果它存储了对List对象的引用,那么该对象在Server内存中的生命周期是多少?每次服务器收到请求时是否重新创建?
谁能为我解释一下这个机制?
让我举个简单的例子:
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<string> myList = new List<string> { "a", "b", "c" };
Response.Write(string.Join(";", myList.ToArray()) + "<br>");
ViewState["myList"] = myList;
myList.Add("d");
List<string> myListSavedInViewstate = (List<string>)ViewState["myList"];
Response.Write(string.Join(";", myListSavedInViewstate.ToArray()) + "<br>");
myListSavedInViewstate.Add("e");
Response.Write(string.Join(";", myList.ToArray()) + "<br>");
Response.Write(myList.GetHashCode() + "<br>");
Response.Write(myListSavedInViewstate.GetHashCode() + "<br>");
}
}
输出为:
a;b;c
a;b;c;d
a;b;c;d;e
34781257
34781257
所以基本上是的,Viewstate 在整个页面生命周期中保留一个引用而不是对象(引用类型)的副本。但是,一旦请求结束,Viewstate 就会在隐藏字段中序列化并返回给客户端,并且 Viewstate 实例会被删除。当回发发生时,视图状态被反序列化并重新创建。然而,重新创建的视图状态实例只是它在页面生命周期执行期间用来保存引用的所有对象的浅表副本。这就是为什么在视图状态中允许的所有 类 都必须实现 ISerializable 接口(或必须具有 Serializable 属性)。
然而,这只是冰山一角 ;) 如果您想阅读有关该主题的更多内容,这里有一篇关于视图状态的非常好的文章。
http://weblogs.asp.net/infinitiesloop/Truly-Understanding-Viewstate