我正在使用 Redirect After Post我的 ASP.NET MVC 应用程序中的模式。我有
以下场景:
/controller/index
他被要求填写表格。 /controller/calculate
. Calculate
action 根据输入执行计算并实例化包含操作结果的复杂对象。该对象存储在 TempData
并且用户被重定向到 /controller/result
. /controller/result
从 TempData
检索结果并将它们呈现给用户。 这种方法的问题在于,如果用户在查看
/controller/result
中的结果时按下 F5 键。该页面无法再呈现为 TempData
已过期且结果对象不再可用。用户不希望这种行为。一种可能的解决方案是在 POST 后不重定向,而只是呈现结果 View 。现在,如果用户按 F5,他会收到一个浏览器对话框,询问他是否要重新发布表单。这也是不希望的。
我想到的一种可能的解决方案是在重定向之前序列化结果对象并将其传递到 URL 中,但 AFAIK GET 请求的长度有一些限制,如果对象变得非常大,我可能会遇到这个限制(特别是如果 base64 编码)。
另一种可能性是使用
Session
对象而不是 TempData
坚持结果。但在实现此解决方案之前,我想知道是否有更好的方法。更新:
进一步调查这个问题,我发现如果我将结果对象重新放入
TempData
内/controller/result
行动它实际上有效:public ActionResult Result()
{
var result = TempData["result"];
TempData["result"] = result;
return View(result);
}
但这感觉有点脏。这种方法会不会有任何副作用(例如切换到进程外 session 提供程序,因为我目前使用的是 InProc)?
最佳答案
使用一些唯一的 key 将它存储在 session 中,并将 key 作为 url 的一部分传递。然后,只要 session 处于事件状态,他们就可以使用后退/前进按钮来满足他们的需求,并且仍然可以使 URL 正确响应。或者,您可以使用 ASP 缓存,但我通常会为用户之间共享的对象保留该缓存。当然,如果你使用计算的参数作为key,并且在缓存中找到了结果,你可以简单地重新使用它。
关于asp.net-mvc - 在 ASP.NET MVC 中发布后重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1567857/