在ASP.NET MVC中重定向后发布

Dar*_*rov 5 asp.net-mvc

我在ASP.NET MVC应用程序中使用Redirect After Post模式.我有以下场景:

  1. 用户前往/controller/index他被要求填写表格的地方.
  2. 表单值已发布到/controller/calculate.
  3. Calculate操作基于输入执行计算,并实例化包含操作结果的复杂对象.存储此对象,TempData并将用户重定向到/controller/result.
  4. /controller/result从中检索结果TempData并将其呈现给用户.

这种方法的问题在于,如果用户在查看/controller/result页面中的结果时点击F5,则无法再将其呈现为TempData已过期且结果对象不再可用.

用户不希望出现这种行为.一种可能的解决方案是在POST之后重定向,而不是渲染结果视图.现在,如果用户点击F5,他会得到一个浏览器对话框,询问他是否要重新发布表单.这也是不希望的.

我想到的一个可能的解决方案是序列化结果对象并在重定向之前将其传递给URL,但AFAIK对GET请求的长度有一些限制,如果对象变得很大,我可能会遇到这种限制(特别是如果base64编码) ).

另一种可能性是使用Session对象而不是TempData持久化结果.但在实施此解决方案之前,我想知道是否有更好的方法.


更新:

进一步研究这个问题我发现如果我将结果对象重新放入其实际工作的TempData内部/controller/result:

public ActionResult Result()
{
    var result = TempData["result"];
    TempData["result"] = result;
    return View(result);
}
Run Code Online (Sandbox Code Playgroud)

但这感觉很脏.这种方法是否会产生任何副作用(例如切换到进程外会话提供程序,因为目前我使用的是InProc)?

tva*_*son 5

使用一些唯一键将其存储在会话中,并将密钥作为URL的一部分传递.然后,只要会话处于活动状态,他们就可以使用后退/前进按钮来查看其内容,并且仍然可以正确响应URL.或者,您可以使用ASP缓存,但我通常会为用户共享的对象保留该缓存.当然,如果您使用计算参数作为键,并在缓存中找到结果,则可以简单地重复使用它.