42

有人可以解释一下 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 类的全局范围内?

4

3 回答 3

63

如果搜索对象的大小不是很大,则使用 ViewState。如果您只希望对象在当前页面的生命周期中存在,那么 ViewState 是完美的。

会话对象也可以使用,但很明显,一旦搜索对象在其中,它将在页面的生命周期中存在更长的时间。

另外,我对 ViewState/Session 对象做的一件事是用一个属性包装它们的访问:

public object GetObject
{
    get
    {
        return ViewState["MyObject"];
    }
    set
    {
        ViewState["MyObject"] = value;
    }
}

我倾向于发现这样做更干净。只需更改上面的代码以满足您的需求。

于 2010-05-21T15:06:52.660 回答
31

首先,Viewstate 是每个页面,因为会话在当前会话期间存在于整个应用程序中,如果您希望您的搜索对象在页面之间持续存在,那么会话是正确的方法。

其次,每次回发时,Viewstate 在浏览器和服务器之间以加密文本的形式传输,因此您在 Viewstate 中存储的越多,每次从客户端返回和返回的数据就越多,而会话存储在服务器端唯一来回的就是会话标识符,可以是 cookie 也可以是 URL。

session 或 viewstate 是否是存储搜索对象的正确位置取决于您正在使用它做什么以及其中包含哪些数据,希望上述说明将帮助您确定使用正确的方法。

于 2010-05-21T15:06:56.223 回答
2

视图状态是特定于页面的,而会话状态是特定于浏览器的。您不能通过视图状态将数据从一个页面传递到另一个页面。但是您将使用会话状态。每个会话都有一些唯一的ID,其中视图状态将数据存储在页面本身的隐藏字段中。会话将数据存储在服务器端,而视图状态数据存储在页面上,因此它使页面变得沉重并且应用程序变慢。每个控件默认都有视图状态 true 存储其状态(控件状态),我们可以通过使 enableviewstate=false 轻松启用或禁用它

于 2016-06-28T13:34:33.603 回答