1

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

背景

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

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

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

4 回答 4

4

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

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

于 2009-01-23T14:02:47.373 回答
1

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

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

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

于 2009-01-23T16:50:50.123 回答
1

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

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

HEADS UP: Some controls might contain some client-side javascript code which may reference the viewstate on client-side (duh). If the viewstate is now stored on server-side you will get a null-reference exception (for instance, clicking a commandfield in a gridview). I'm working on a workaround for this problem, but unfortunately I do not have any concrete solution as of yet.

于 2009-08-04T11:03:58.873 回答
0

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

于 2009-01-23T16:52:43.427 回答