有人可以解释一下ViewState和Session之间的区别吗?
更具体地说,我想知道在我的页面的整个生命周期中保持对象可用的最佳方法(通过回发连续设置成员)。
我目前使用Sessions来做这件事,但我不确定这是不是最好的方法。
例如:
SearchObject searchObject;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
searchObject = new SearchObject();
Session["searchObject"] = searchObject;
}
else
{
searchObject = (SearchObject)Session["searchObject"];
}
}
允许我在我的页面上的任何其他地方使用我的searchObject,但它有点麻烦,因为如果我更改任何属性等我必须重置会话var。
我认为必须有更好的方法来实现这一点,以便.NET不会在每次加载页面时重新实例化对象,而且还将它放在Page类的全局范围内?
答案 0 :(得分:58)
如果搜索对象的大小不是很大,那么请使用ViewState。如果您只希望对象在当前页面的生命周期中存活,则ViewState是完美的。
会话对象也可以使用,但很明显,一旦搜索对象在那里,它将在页面的生命周期中存在更长时间。
此外,我使用ViewState / Session对象做的一件事就是使用属性包装它们的访问权限:
public object GetObject
{
get
{
return ViewState["MyObject"];
}
set
{
ViewState["MyObject"] = value;
}
}
我倾向于发现这样做更清洁。只需更改上述代码即可满足您的需求。
答案 1 :(得分:28)
首先,Viewstate是每页,当前会话期间整个应用程序中存在会话,如果您希望搜索对象在页面中保持不变,那么会话是正确的方法。
其次,Viewstate在浏览器和服务器之间以每个回发的形式作为加密文本传输,因此您在Viewstate中存储的数据越多,每次从客户端返回和返回的数据越多,而会话是存储的服务器端,唯一可以来回的是会话标识符,可以是cookie,也可以是URL。
会话或视图状态是否是存储搜索对象的正确位置取决于您使用它做什么以及其中包含哪些数据,希望上述说明可以帮助您确定正确的使用方法。
答案 2 :(得分:1)
视图状态是特定于页面的,其中会话状态是特定于浏览器的。您无法通过视图状态将数据从一个页面传递到另一个页面。但你会做会话状态。 每个会话都有一些唯一的ID,其中View状态将数据存储在页面本身的隐藏字段中.Session将数据存储在服务器端,其中视图状态数据存储在页面上,因此它使页面繁重,应用程序变慢。 默认情况下,每个控件的视图状态为true,用于存储其状态(控制状态),我们可以通过使enableviewstate = false
轻松启用或禁用它