2011-03-26 59 views

回答

0

您不能/不應該從HttpContext.Current訪問TempData。你需要一個控制器實例。不幸的是,因爲你沒有解釋你的情況,爲什麼你需要這樣做,我不能爲你提供一個更好的選擇。

+9

我正在創建一個以更友好/類型安全的方式包裝TempData的類。它在內部使用TempData,但我不想公開這個事實。我不想在像'new MyTempDataWrapper(this.TempData)'中傳遞TempData。如果TempData只存儲在Session中,並且Session可以從HttpContext.Current訪問,爲什麼我不能從HttpContext.Current訪問TempData? – BowserKingKoopa 2011-03-26 20:05:51

0

將您的評論發送給其他答案,您可以實現自己的ITempDataProvider,然後重寫控制器以使用它。看一下Mvc3Futures中的CookieTempDataProvider類,它將tempdata存儲在cookie而不是會話中,以查看這是如何實現的。

http://volaresystems.com/Blog/post/2011/06/30/Sessionless-MVC-without-losing-TempData.aspx

而不是改變的TempData存儲在何處,您的實現可以從SessionCookieTempDataProvider可能繼承和簡單的添加類型安全的方法吧。

1

如果由於自己的設計決定而不傳遞上下文對象作爲參數,那麼您至少可以在您自己的全局靜態類上使用[ThreadStatic]。對於Property訪問的成員來說,這可能會很方便,而這些成員又必須依賴這樣的ThreadStatic參數,因爲它們不是函數。

ThreadStatic可以幫助將同一線程上的資源共享到遠處的堆棧幀,而無需傳遞參數。 HttpContext.Current使用ThreadStatic來實現這一點。

一個常規的MVC控制器類不會爲你做這個。因此,您需要爲您的項目中的所有控制器創建自己的類以從中繼承。

public class MyController : Controller 
{ 
    public MyController() 
    { 
    _Current = this; 
    } 

    [ThreadStatic] 
    public static RacerController _Current = null; 

    public static RacerController Current 
    { 
     get 
     { 
      var thisCurrent = _Current; //Only want to do this ThreadStatic lookup once 
      if (thisCurrent == null) 
       return null; 
      var httpContext = System.Web.HttpContext.Current; 
      if (httpContext == null) //If this is null, then we are not in a request scope - this implementation should be leak-proof. 
       return null; 

      return thisCurrent; 
     } 
    } 

    protected override void Dispose(bool disposing) 
    { 
    _Current = null; 
    base.Dispose(disposing); 
    } 
} 

用法:

var thisController = MyController.Current; //You should always save to local variable before using - you'll likely need to use it multiple times, and the ThreadStatic lookup isn't as efficient as a normal static field lookup. 
var value = thisController.TempData["key"]; 
thisController.TempData["key2"] = "value2";