从HttpContext.Current访问TempData

时间:2011-03-26 19:44:01

标签: asp.net-mvc-3

如何从HttpContext.Current访问TempData?

3 个答案:

答案 0 :(得分:1)

如果由于您自己的设计决定而未将上下文对象作为参数传递,那么您至少可以在自己的全局静态类中使用[ThreadStatic]。这对于属性访问的成员来说是方便的,而后者必须依赖于这样的ThreadStatic参数,因为它们不是函数。

ThreadStatic可以帮助将同一线程上的资源共享到远程堆栈帧,而无需传递参数。 HttpContext.Current使用ThreadStatic来实现这一点。

常规MVC Controller类不会为您执行此操作。因此,您需要为项目中的所有控制器创建自己的类以继承。

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

答案 1 :(得分:0)

您不能/不应该从TempData访问HttpContext.Current。你需要一个控制器实例。不幸的是,因为你没有解释你的情况,为什么你需要这样做,我无法为你提供更好的选择。

答案 2 :(得分:0)

将您的评论发送到另一个答案,您可以实现自己的ITempDataProvider,然后覆盖Controller以使用它。看看Mvc3Futures中的CookieTempDataProvider类,它将tempdata存储在cookie而不是session中,以查看它是如何实现的。

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

您可以继承SessionCookieTempDataProvider并简单地为其添加类型安全的方法,而不是更改tempdata的存储位置。