2009-05-27 194 views
2

当我执行重定向时,我需要传递值。我想用TempData来完成这个,但遇到了一个问题。ASP.NET MVC:跨多个请求保留TempData

我使用一个特殊的控制器来生成动态JavaScript。例如,有可能是一个脚本标签是这样的:

<script type="text/javascript" src="/Resource/Script/Login.js"></script> 

...但没有脚本文件“Login.js。”相反,ResourceController的脚本动作被称为:

public class ResourceController : Controller { 
    public ActionResult Script(string id) { 
     // set script = some code 
     return JavaScript(script); 
    } 
} 

的问题是,这个吃了下一个请求,这意味着我不能使用TempData的从一个页面重定向与动态脚本。脚本动作(或整个ResourceController)是否可以选择不使用TempData,使其可用于下一个“真实”请求?

预先感谢您!

+1

请您设置的TempData并调用RedirectToAction显示的代码示例()读取后面将保持()的理由。 – 2009-05-27 09:21:11

回答

3

会话在多个请求之间保留。

+2

同意 - 你错过了TempData的要点,如果你想这样做 – joshcomley 2009-05-27 09:10:54

5

你可以放置线

<script type="text/javascript" src="/Resource/Script/Login.js"></script> 

鉴于使用的TempData后。

本文还可能对您有用:ASP.NET MVC TempData Is Really RedirectData

+1

我肯定会推荐这篇文章呢! – joshcomley 2009-05-27 09:11:32

2

让你的控制器超覆盖ExecuteCore,它清除的TempData。我不是说这是个好主意......

protected override void ExecuteCore() 
{ 
    string actionName = RouteData.GetRequiredString("action"); 
    if (!ActionInvoker.InvokeAction(ControllerContext, actionName)) 
    { 
     HandleUnknownAction(actionName); 
    } 
} 
0

为什么不创建PreserveTempDataAttribute,您可以使用它来装饰您的脚本动作。如果它不为null,它可以重新分配TempData。

8

Asp.Net团队通过引入TempData.Keep()来消除MVC 2中的这种痛苦,它可以确保所有TempData项目都被标记为可以存活一个请求。从你想要的所有动作调用这个不是吃TempData。

Jacques Eloffs blog post

Keep() in MSDN docs