【问题标题】:How can I hide query string parameters using the Post, Redirect, Get pattern?如何使用 Post、Redirect、Get 模式隐藏查询字符串参数?
【发布时间】:2012-09-03 15:30:58
【问题描述】:

我的 ASP.NET MVC 应用程序中有一个多步骤数据输入表单。

发布信息时,会检查输入值,如果我确定需要一些相关数据(例如,采购订单引用了不存在的供应商),我会重定向到另一个操作,以便用户可以输入额外的数据。

我不希望用户已经输入的值在页面之间丢失,因此我使用 viewModel 将这些值传递给第二个操作方法。数据包含在第二页的隐藏输入中,因此用户无法看到它们。

这很好用,只是我最终得到的 URL 看起来像这样:

myDomain/RFQ/CreatePart?PartNumber=Skateboard&Supplier=Bobs%20skateboards&DateCreated=08%2F28%2F2012%2000%3A00%3A00&DateRequired=08%2F28%2F2012%2000%3A00%3A00&Quantities=1%2C%203%20%26 %205%20 折

我尝试简单地返回一个视图而不是重定向,这给了我这样的 URL:

myDomain/RFQ/CreatePart

但是,这给我带来了用户能够通过刷新浏览器重新发布值的问题,因为我现在不再关注发布、重定向、获取模式。

有没有办法在保持更简洁的 URL 的同时正确使用 Post-Redirect-Get 模式?


2012 年 9 月 29 日更新

我调查了下面列出的选项,并决定暂时使用SessionState,因为这允许我存储中间数据,直到用户完成他们的交易,同时允许我使用 post-redirect-get 具有干净 URL 的模式。

在问这个问题之前,我实际上知道SessionState,但不幸的是,我读到的一些关于它的信息让我相信这不是最好的解决方案(大多数文章都提到性能不佳,但很少提供任何证据或解释原因)。

阅读了this 的文章,我现在对SessionState 的理解好多了。

【问题讨论】:

  • 您可以将中间步骤数据放入会话中吗?在这种情况下,您将能够使用 PRG,而用户将无法重写数据。
  • 你也可以试试 cookie 或 session 等。

标签: c# asp.net-mvc-3 wizard


【解决方案1】:

选项如下(顺序不代表好坏)

  1. 将这些值添加到TempData,它们将一直可用,直到该用户在下一次请求时读取它们,然后自动清除。
  2. 将中间步骤保存到数据库中。
  3. 将中间步骤保存在Cache 中(如果数据在用户之间共享)。
  4. 将中间步骤保存到SessionState(如果数据是每个-用户)。
  5. 在这种情况下,谁在乎它是否是一个丑陋的中间 URL?

【讨论】:

  • 我不完全确定 TempData 方法在这种情况下是否合适。当我重定向时,我将 TempData 传递给我的视图。如果用户刷新,则 TempData 已清除 bean,为用户留下一个空白表单(我使用 DisplayFor 显示在上一步中输入的一些数据)。
  • 如果您可能多次需要它,您需要在阅读后尝试设置它,以便下次请求时再次可用。就个人而言,我会缓存每个步骤,这只是我,但您可以使用注入控制器的一些 ICache 接口测试/模拟缓存的依赖项。另一方面,TempData 具有相当不可测试的行为。您知道的缓存条目应该存在,直到您专门清除它(在向导的开始或结束时,或者一旦用户重新保存该步骤)
  • 当您谈到使用缓存时,它与使用会话或完全一样吗?
  • 不,有些不同 - 请参阅:blog.overridethis.com/blog/post/2009/03/11/…
猜你喜欢
  • 2012-11-08
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多