在ASP.NET-MVC中的请求之间保持数据的标准方法

时间:2010-03-18 16:58:52

标签: asp.net asp.net-mvc session cookies

在请求之间保留数据的最标准或最佳方法是什么?

我应该使用Cookie还是会话变量?我有兴趣保留排序顺序,排序列和页码(用于分页)等数据。

我来自webforms背景,所以通常这种类型的东西在我使用的控件的viewstate中自动处理。

更新

我喜欢查询字符串的想法,用于搜索和更有意义的网址;但是,我正在开发一个“索引/列表”视图,它包含一个带有标题的视图和“控制”选项,如用于过滤的DDL和用于呈现数据表的局部视图。

DDL使用$.load()来调用控制器上的ActionResult,它返回部分视图,在查询字符串中传递参数,但由于这些是ajax请求,因此用户浏览器的主页面URL无法获取更新。

是否存在从主页网址中获取查询字符串并在其他ActionResults的ajax请求中使用查询字符串的最佳做法?

7 个答案:

答案 0 :(得分:6)

如果你希望它只能通过一个请求/重定向生存TempData是你的朋友。

但是,对于像您的分页这样的内容,URL是最好的方法,因为它可以单独共享链接。

答案 1 :(得分:3)

标准方法是通过URL查询参数传递这些内容。您可以修改路由以期望某些URL变量。这样页面也变得更加适合搜索引擎。

答案 2 :(得分:1)

为了响应您的更新,实现 pages 的一个好方法是链接到“Previous”和“Next”页面的结果(或者更好的是,所有页面的列表在列表中),页面上的输出,带有页码,然后用JavaScript隐藏。

这样用户应该看到你的漂亮,AJAXy行为,搜索引擎(以及没有JavaScript的用户 - 移动设备,或那些使用旧版屏幕阅读器的用户)仍然可以访问您的所有网页 - 这将有助于您页面要优雅地降级,或使用“渐进增强”。

答案 3 :(得分:0)

这取决于您希望信息的永久性:

  • 页面编号之类的内容确实应该在URL中(正如其他人指出的那样) - 这有助于书签等,但请记住,如果您向列表添加更多内容,那么该书签结果集将不会始终如此用户想要的......
  • 如果您对会话超时(默认情况下大约20分钟)丢失这些值感到高兴,请将它们放入会话中。
  • 如果您认为会话将​​在下一个请求之前超时,或者您希望在访问期间保存会话,那么您应该将它们存储在Cookie或配置文件中(可能允许“匿名”配置文件,这些配置文件适用于用户cookie,所以他们会在机器上丢失它们。)

就我个人而言,我会非常仔细地考虑在网址中放置排序顺序和列,如果你真的最终会让搜索引擎感到困惑:

  1. 内容非常相似的大量页面(第1页,按日期排序,第1页按日期asc排序等) - 搜索引擎不喜欢重复内容,您也不应该像Google(例如)那样只会在默认结果集中显示您网站的两个页面,您希望它们有效,而不是重复。
  2. 搜索引擎会花费更多时间来抓取您的网站,并可能放弃 - 如果在每个页面上都找到“按此列排序”的链接,他们会尝试关注这些链接,从而导致服务器上的更多工作,更高带宽使用等
  3. 这些可以通过使用Robots.txt文件来减轻,该文件拒绝访问页面的排序版本,但如果这几乎是动态生成的,那么维护这一过程将非常复杂。

答案 4 :(得分:0)

以前在viewstate中的东西应该通过隐藏字段或cookie放回到客户手中。

会议“太”容易了。在开发环境中,无论你放入什么内容,它都非常有用。在生产中,可伸缩性和持久性成为一个问题。如果您的站点中存在崩溃错误,并且在负载平衡时需要服务器关联,则进程内会话可能会意外消失。进程外会话修复了持久性和亲和性问题,但如果在会话中放入太多东西,它仍然可以成为性能瓶颈。一个非常常见的问题是每个页面会将1或2个项目放入会话中,但在完成后不会再将它们取出。即使页面在不再需要时删除会话数据,如果用户启动进程并且永远不会完成它,数据仍然可能会被孤立。

答案 5 :(得分:0)

Cookie是一种在请求之间保留数据的快速而简单的方法,您也可以根据需要使其仅为limited time生效。

答案 6 :(得分:-1)

会话最简单。