【发布时间】:2010-12-06 18:34:39
【问题描述】:
我在我的 ASP.NET MVC 应用程序中使用Redirect After Post 模式。我有 以下场景:
- 用户转到
/controller/index,要求他填写表格。 - 表单值发布到
/controller/calculate。 -
Calculate操作根据输入执行计算,并实例化一个包含操作结果的复杂对象。该对象存储在TempData,用户被重定向到/controller/result。 -
/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);
}
但这感觉有点脏。这种方法是否有任何副作用(例如切换到进程外会话提供程序,因为我目前使用 InProc)?
【问题讨论】:
-
当你说“重定向”时,你是在调用 RedirectToAction 吗?
标签: asp.net-mvc