Доступ к TempData из HttpContext.Current

Как я могу получить доступ к TempData из HttpContext.Current?

Ответ 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";

Ответ 2

Вы не можете/не должны получать доступ к TempData из HttpContext.Current. Вам нужен экземпляр контроллера. К сожалению, поскольку вы не объяснили свой сценарий и зачем вам это нужно, я не могу предоставить вам лучшую альтернативу.

Ответ 3

Обращаясь к вашему комментарию к другому ответу, вы можете реализовать свой собственный ITempDataProvider, а затем переопределить контроллер для его использования. Взгляните на класс CookieTempDataProvider в Mvc3Futures, который хранит tempdata в файлах cookie, а не в сеансе, чтобы увидеть, как это возможно.

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

Вместо того, чтобы изменять, где хранится tempdata, ваша реализация могла бы наследоваться от SessionCookieTempDataProvider и просто добавлять к ней безопасные типы.