繁体   English   中英

ViewState与Session ...通过页面生命周期维护对象

[英]ViewState Vs Session … maintaining object through page lifecycle

有人可以解释一下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,但它有点麻烦,因为我必须重置我的会话变量,如果我改变任何属性等。

我认为必须有一个更好的方法来实现这一点,以便.NET不会在每次加载页面时重新实例化对象,而且还将它放在Page类的全局范围内?

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

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

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

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

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

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

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

会话或视图状态是否是存储搜索对象的正确位置取决于您正在使用它以及其中包含的数据,希望上述说明可帮助您确定正确的方法。

视图状态是特定于页面的,其中会话状态是特定于浏览器的。 您无法通过视图状态将数据从一个页面传递到另一个页面。 但你会做会话状态。 每个会话都有一些唯一的ID,其中View状态将数据存储在页面本身的隐藏字段中.Session将数据存储在服务器端,其中视图状态数据存储在页面上,因此它使页面繁重,应用程序变慢。 默认情况下,每个控件的视图状态为true,用于存储其状态(控制状态),我们可以通过使enableviewstate = false来轻松启用或禁用它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM