2011-03-26 15 views

Respuesta

0

No puede/no debe tener acceso TempData de HttpContext.Current. Necesitas una instancia de controlador. Lamentablemente, debido a que no ha explicado su situación y por qué necesita hacer esto, no puedo brindarle una mejor alternativa.

+9

Estoy creando una clase que envuelve TempData de una forma más amigable/tipo segura. Utiliza TempData internamente, pero no quiero exponer ese hecho. No quiero tener que pasar TempData como 'nuevo MyTempDataWrapper (this.TempData)'. Si TempData solo se almacena en Session y se puede acceder a Session desde HttpContext.Current, ¿por qué no debería poder acceder a TempData desde HttpContext.Current? – BowserKingKoopa

0

Dirigiendo su comentario a la otra respuesta, puede implementar su propio ITempDataProvider y luego anular el controlador para usarlo. Eche un vistazo a la clase CookieTempDataProvider en Mvc3Futures que almacena tempdatos en cookies en lugar de sesiones para ver cómo es posible.

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

En lugar de cambiar donde se almacena TempData, su aplicación podría posible Heredar del SessionCookieTempDataProvider y simplemente añadir métodos de tipo de fallos para él.

1

Si desea hacer esto sin pasar el objeto de contexto como parámetro debido a sus propias decisiones de diseño, puede al menos usar [ThreadStatic] en su propia clase estática global. Esto puede ser conveniente para los miembros a los que se accede desde la propiedad, que a su vez deben confiar en dicho parámetro ThreadStatic, ya que no son funciones.

ThreadStatic puede ayudar a compartir recursos en el mismo subproceso a los marcos de pila distantes sin necesidad de pasar parámetros. HttpContext.Current usa ThreadStatic para lograr esto.

Una clase regular de controlador MVC no hará esto por usted. Por lo tanto, deberá crear su propia Clase para todos los Controladores de su proyecto para heredar.

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); 
    } 
} 

Uso:

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";