2009-05-27 83 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