如何在以后保留ViewState以供重用?

时间:2009-01-23 14:01:29

标签: asp.net viewstate

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

背景

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

如果用户测试了不同的演示文稿,只需使用后退按钮就可以在用户返回报告页面之前进行相当多的点击。我想直接链接到报告页面。

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

4 个答案:

答案 0 :(得分:4)

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

编辑:重新阅读你的帖子,看到你说你无法自定义整个应用程序的viewstate存储方式。如果是这种情况,您可能希望将其存储在会话中。 Scott Hanselman讨论了here

答案 1 :(得分:1)

您的链接可以使用JavaScript自动导航回所需的页数。看看window.history,如果你可以计算前进的页数,你可以导航回那么多。

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

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

答案 2 :(得分:1)

为了澄清,SQLViewstateProvider不是一个应用程序范围的实现。您必须创建一个继承自System.Web.UI.Page对象的类,并重写Parent Page类的Save And Load viewstate方法。对于希望将视图状态保存在服务器端的每个页面,您必须从新创建的页面模板继承(而后者继承并覆盖System.WEb.UI.Page类)。

因此,它是基于每页应用的,而不是在应用程序范围内应用。

HEADS UP:某些控件可能包含一些客户端javascript代码,可能会在客户端(duh)引用viewstate。如果viewstate现在存储在服务器端,您将获得空引用异常(例如,单击gridview中的命令字段)。我正在研究解决这个问题的方法,但遗憾的是我还没有任何具体的解决方案。

答案 3 :(得分:0)

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