ASP.NET MVC:跨多个请求保留TempData

时间:2009-05-27 08:54:13

标签: asp.net-mvc tempdata

执行重定向时,我需要传递一些值。我想使用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,允许它可用于下一个“真正的”请求?

提前谢谢!

5 个答案:

答案 0 :(得分:8)

Asp.Net团队通过引入TempData.Keep()消除了MVC 2中的这种痛苦,它确保所有TempData项目都被标记为可以再生一个请求。从您希望吃TempData的所有操作中调用此方法。

阅读在Jacques Eloffs blog post

中介绍Keep()背后的理由

Keep() in MSDN docs

答案 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。