2009-11-03 42 views
2

我知道TempData只能在單個頁面請求之間工作。但我認爲有一種情況我認爲打破了預期的功能。告訴動作/控制器堅持TempData

我首先使用控制器來處理圖像。如果這是最好的做法,我現在不會這樣做,但對我來說這很有效。但問題是,每次調用其中一個圖像操作時,顯然會佔用一個TempData信用。

是否有MVC的方式說「這個控制器/行動是否超出正常的頁面請求的範圍」,因此無論是堅持到TempData或完全TempData的生命週期自身刪除?

Rich

+0

你幾乎肯定會濫用TempData。 TempData僅用於重定向。如果您將其用於重定向,則圖像不會成爲問題,因爲HTML請求*必須*在圖像請求之前。因爲你說圖像請求會干擾TempData,所以我斷定你在重定向的上下文之外使用它。請參閱http://blogs.teamb.com/craigstuntz/2009/01/23/37947/以獲取更全面的解釋。 – 2009-11-03 15:37:33

+0

感謝您的回覆。你是正確的,我沒有在重定向中使用TempData,但我不同意TempData僅適用於重定向。我很高興被證明是錯誤的,但我使用TempData在相同的頁面帖子之間傳遞數據。我不想使用ViewData,因爲我不會將這些信息嵌入到HTML中。 – kim3er 2009-11-03 16:17:13

+0

那是你的問題。我上面所說的一個證據就是,你現在正在做的事情是行不通的。只有在重定向的情況下,您纔有*確定「下一個」請求的內容。唯一可靠的解決方法是正確使用TempData。 – 2009-11-03 17:20:06

回答

2

我的解決方案是創建一個跨頁持續到TempData的屬性要求。我對此的最初反應是「yuck」,但我想要從TempData生命週期中有效地排除任何使用Attribute進行裝飾的控制器。

using System.Web.Mvc; 

namespace K3R.Web.Mvc.Filters { 
    public sealed class PersistTempDataAttribute : ActionFilterAttribute { 
     public PersistTempDataAttribute() { } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) { 
      var tempData = filterContext.Controller.TempData; 
      if (tempData == null || tempData.Count == 0) 
       return; 

      string[] keys = new string[tempData.Keys.Count]; 
      tempData.Keys.CopyTo(keys, 0); 
      foreach (var key in keys) 
       tempData[key] = tempData[key]; 
     } 
    } 
} 

任何有關更好的解決方案的反饋將不勝感激。

+0

我不認爲完全排除控制器形式的生命週期是可能的。 您可以將PersistTempDataAttribute應用於整個控制器或單個方法。 請記住,在您的函數之後執行「OnActionExecuting」方法之前執行<您的實際函數和方法>。 但是,將信息存儲在單個請求之外應該更好地存儲在數據庫或任何其他緩存系統中。 – Sebastian 2009-11-03 14:24:50

+0

當然,我完全同意。我只是不想讓包含圖像控制器的使用TempData的現有代碼混亂。我承認,使用單獨的控制器來傳遞圖像等輔助項目可能不是這種情況下的最佳選擇。 – kim3er 2009-11-03 15:56:30

+1

它看起來像MVC2現在改變了TempData的工作方式。它現在一直持續到數據被使用。 – kim3er 2010-03-10 12:30:18

0

我不確定這個確切的答案,因爲我對MVC自己來說很新。不過,我聽說有人在AJAX請求中遇到麻煩,並在他們想要之前殺死了TempData。

我想你可以實現你自己的基於會話的系統來存儲這些信息?

雖然有人會盡快給你一個更完整的答案!

+0

我將Image Controllers添加到已經使用TempData的工作流中,我不希望搖動船。 由於這個原因,我正在處理一個保存TempData的屬性。我知道這違背了TempData的目的,但我將這些助手控制器視爲特殊情況。 感謝您的幫助。 – kim3er 2009-11-03 13:12:46

-1

我不完全理解你做這件事的方式,爲什麼,但我寧願和處理者一起去。或者,如果你堅持控制器操作,我可以說這對我來說很好,沒有任何問題提供圖像的動態和我在我的控制器操作中使用FileContentResult。

像這樣:

 return File(imageBytes, imageType); 

你得到字節數據存儲出的或某處..

希望它有助於

+0

圖像操作正在工作,它是我對感興趣的TempData的影響。 – kim3er 2009-11-03 13:16:16