【发布时间】: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