执行重定向时,我需要传递一些值。我想使用TempData来实现这一目标,但遇到了一个问题。
我使用特殊的控制器来生成动态JavaScripts。例如,可能有这样的脚本标记:
<script type="text/javascript" src="/Resource/Script/Login.js"></script>
...但是没有脚本文件“Login.js”。相反,正在调用ResourceController的Script操作:
public class ResourceController : Controller {
public ActionResult Script(string id) {
// set script = some code
return JavaScript(script);
}
}
问题是,这会占用下一个请求,这意味着我无法使用TempData从具有动态脚本的页面重定向。有没有什么方法脚本操作(或整个ResourceController)可以选择不使用TempData,允许它可用于下一个“真正的”请求?
提前谢谢!
答案 0 :(得分:8)
Asp.Net团队通过引入TempData.Keep()消除了MVC 2中的这种痛苦,它确保所有TempData项目都被标记为可以再生一个请求。从您希望不吃TempData的所有操作中调用此方法。
中介绍Keep()背后的理由答案 1 :(得分:5)
您可以放置
行<script type="text/javascript" src="/Resource/Script/Login.js"></script>
在视图中使用TempData后。
这篇文章也可能对您有用:ASP.NET MVC TempData Is Really RedirectData
答案 2 :(得分:4)
会话在多个请求之间保留。
答案 3 :(得分:2)
让你的控制器超类型覆盖ExecuteCore,它会清除TempData。我不是说这是个好主意......
protected override void ExecuteCore()
{
string actionName = RouteData.GetRequiredString("action");
if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
{
HandleUnknownAction(actionName);
}
}
答案 4 :(得分:0)
为什么不创建一个PreserveTempDataAttribute,您可以使用它来装饰脚本操作。如果TempData不为null,它可以重新分配TempData。