asp.net-mvc - 在 ASP.NET MVC 中发布后重定向

标签 asp.net-mvc

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

  • 用户转至 /controller/index他被要求填写表格。
  • 表单值被发布到 /controller/calculate .
  • Calculate action 根据输入执行计算并实例化包含操作结果的复杂对象。该对象存储在 TempData并且用户被重定向到 /controller/result .
  • /controller/resultTempData 检索结果并将它们呈现给用户。

  • 这种方法的问题在于,如果用户在查看 /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/

    相关文章:

    .net - ASP.NET MVC-如何从局部 View 中获取当前操作?

    asp.net - SEO:带有和不带有破折号 "/"和 ASP.NET MVC 的重复 URL

    javascript - 使用 Razor 和 javascript 在新窗口中打开图像

    asp.net-mvc - 简单问题: Setup mock for ajax request in asp.net mvc

    jquery - 部署为虚拟目录时,MVC 站点外部脚本不起作用

    .net - 将工作单元和存储库模式与 Entity Framework 结合使用的好处

    c# - asp.net mvc 中的表单超时问题

    c# - 如何动态显示模型中每个属性的显示名称和值

    c# - OWIN 能否替代 ASP.NET MVC 应用程序中的 DI?

    asp.net-mvc - JSON 到动态 - 'Newtonsoft.Json.Linq.JObject' 不包含定义