【问题标题】:ViewState Vs Session ... maintaining object through page lifecycleViewState Vs Session ...通过页面生命周期维护对象
【发布时间】:2011-02-22 09:54:28
【问题描述】:

谁能解释一下 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 要求存储的项目是可序列化的。否则,您将收到序列化异常。

标签: c# .net session viewstate global-scope


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嗨,Jason,虽然感谢您对改进 Stack Overflow 内容的奉献精神,但有些人(包括我自己)对您最近从古老的问题中删除脏话的浪潮有些不满。这里有一些讨论:Let's clean up low-quality posts with profanity on Stack Overflow您的编辑波出现在 Meta 上,尽管问题是关于今天碰巧有同样想法的其他人:What if a user is searching and only removing profanity?
  • 虽然我不能阻止您进行这些编辑,但如果您能够查看讨论并考虑避免系统地搜索这些内容,我将不胜感激。谢谢!
  • 很公平。我只是觉得有这些话不合适。我不会再这样做了。
  • 对不起,我不明白,为什么不总是 return ViewState["MyObject"]; ?检查的工作是什么。
  • @TPAKTOPA 是的,让NULL 检查是没有意义的。我已将其从代码示例中删除。谢谢:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多