如何从HttpContext.Current访问TempData?
答案 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的存储位置。