【问题标题】:How to persist ViewState for reuse later?如何持久化 ViewState 以供以后重用?
【发布时间】:2009-01-23 14:01:29
【问题描述】:

是否可以保存 ViewState 信息,例如到会话,以便当您离开页面时它会以某种方式持续存在?然后,当您返回该页面时,您可以重新加载视图状态并保留您所做的选择。

背景

我有两个页面,一个报告页面,您可以在其中选择数据,进行一些过滤和排序等以及一个图表页面,您从报告页面中选择的数据可以以不同的方式呈现,有不同的选择用于演示。

如果用户测试了不同的演示文稿,则只需使用后退按钮可能意味着在用户返回报告页面之前单击很多次。我想要报告页面的直接链接。

  • 不能使用 QueryString 保存控件状态。
  • 我无法为整个应用程序自定义 ViewState 存储。

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    是的,可以将 Viewstate 存储在数据库之类的东西中。您只需要实现其中一个视图状态提供程序。有关使用 SqlViewStateProvider 的示例,请参阅 here

    编辑:刚刚重新阅读您的帖子,并看到您说您无法自定义视图状态如何为整个应用程序存储。如果是这种情况,您可能需要考虑将其存储在会话中。 Scott Hanselman 讨论了 here

    【讨论】:

    • 我看过这个替代方案,但据我所知,这是一个应用程序范围的实现?我已经声明不可能更改整个应用程序。
    • 是的,我刚刚看到了。您可以将视图状态存储在会话中,但这并不是世界上最漂亮的东西。请参阅我编辑的答案。
    【解决方案2】:

    您的链接可以使用 JavaScript 自动导航回所需数量的页面。看看window.history,如果你能数出向前的页数,你就可以向后导航那么多。

    ViewState 已经被设计为保持用户控件的状态。如果您的用户进行了选择,并且该选择在服务器端进行了处理,并带有整页回发,则控件的新状态将保存在 ViewState 中(隐藏输入 __VIEWSTATE)。

    如果您的报告使用 AJAX 和部分页面回发,那么无论如何您都不会在页面上获得 ViewState。

    【讨论】:

    • Javascript 可能是我们想要的,快速而肮脏,但与在会话中保存视图状态一样,它确实有一些明显的限制。您提到的关于视图状态的内容是已知的,但这里的问题是在页面之间移动时保持视图状态。
    【解决方案3】:

    澄清一下,SQLViewstateProvider 不是应用程序范围的实现。您必须创建一个继承自 System.Web.UI.Page 对象并覆盖父页面类的保存和加载视图状态方法的类。对于您希望将视图状态保存在服务器端的每个页面,您必须从新创建的页面模板(继而继承并覆盖 System.WEB.UI.Page 类)继承。

    所以它是在每页的基础上应用的,而不是在应用程序范围的基础上。

    注意:某些控件可能包含一些客户端 javascript 代码,这些代码可能会引用客户端上的视图状态 (duh)。如果视图状态现在存储在服务器端,您将获得空引用异常(例如,单击网格视图中的命令字段)。我正在努力解决这个问题,但不幸的是我还没有任何具体的解决方案。

    【讨论】:

      【解决方案4】:

      这是一个坏主意,只需使用查询字符串。我很想知道为什么它们不是一个选项。

      【讨论】:

      • 根据编写报告页面的人的说法,有很多动态控件和依赖项(以及很多臭代码),这使得添加和维护查询字符串处理非常耗时且困难。添加新功能。
      猜你喜欢
      • 2013-09-21
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多