如何使用Post,Redirect,Get模式隐藏查询字符串参数?

时间:2012-09-03 15:30:59

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

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

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

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

这样可以正常工作,但我最终得到的URL看起来像这样:

  

myDomain的/ RFQ / CreatePart部分号码=滑板&安培;供应商=鲍勃%20skateboards&安培; dateCreated会= 08%2F28%2F2012%2000%3A00%3A00&安培; DateRequired = 08%2F28%2F2012%2000%3A00%3A00&安培;数量= 1 %2C%203%20%26%205%20off

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

  

myDomain的/ RFQ / CreatePart

但是,这给了我一个问题,即用户可以通过刷新浏览器重新发布值,因为我现在不再关注帖子,重定向,获取模式。

有没有一种方法可以正确使用 Post-Redirect-Get 模式,同时保持更清晰的网址?


2012年9月29日更新

我调查了下面列出的选项,并决定暂时使用SessionState因为这允许我存储中间数据,直到用户完成交易,同时允许我使用后重定向-get 模式,网址干净。

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

阅读this文章后,我现在更了解SessionState

1 个答案:

答案 0 :(得分:1)

选项如下(顺序并不意味着更好或更差)

  1. 将值添加到TempData,它们将一直有效,直到该用户在下次请求中读取这些值,然后自动清除。
  2. 将中间步骤保存到数据库中。
  3. 保存中间步骤在Cache中(如果用户之间的数据共享)。
  4. 将中间步骤保存到SessionState(如果数据 - -user)。
  5. 如果这是一个丑陋的中间URL,谁会关心这个案例呢?