ViewState Vs Session …通过页面生命周期维护对象

有人可以解释一下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"]; } } 

允许我在我的页面的任何地方使用我的search对象,但是这是很麻烦的,因为如果我改变任何属性等,我必须重置我的会议变种。

我想一定有更好的方法来做到这一点,所以.NET不会重新实例化对象,每次页面加载,但也把它放在Page类的全球范围内?

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

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

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

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

我倾向于发现这样做更清洁。 只需更改上面的代码,以适应您的需求。

  • 来源1

  • 来源2

首先,Viewstate是每个页面,当前会话期间会话存在于整个应用程序中,如果您希望您的searchobject在页面之间持续存在,那么session是正确的path。

其次Viewstate作为浏览器和服务器之间的encryption文本传输,每次回发,所以你存储在Viewstate中的数据越多,每次从客户端返回的数据越多,而会话存储在服务器端而唯一来回传输的是会话标识符,可以是cookie或是URL。

会话或视图状态是否是存储search对象的正确位置取决于您正在处理的内容以及其中包含哪些数据,希望以上解释能够帮助您确定正确的方法。

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