2011-03-26 2 views

답변

0

TempDataHttpContext.Current에서 액세스 할 수 없으며 액세스해서도 안됩니다. 컨트롤러 인스턴스가 필요합니다. 불행히도 귀하의 시나리오를 설명하지 않았기 때문에 귀하는 왜 더 나은 대안을 제공 할 수 없습니까?

+9

나는 더 친숙한/형식 안전한 방법으로 TempData를 래핑하는 클래스를 만들고 있습니다. 그것은 내부적으로 TempData를 사용하지만 그 사실을 폭로하고 싶지는 않습니다. 나는 '새로운 MyTempDataWrapper (this.TempData)'처럼 TempData를 전달하고 싶지 않습니다. TempData가 Session에 저장되고 Session에 HttpContext.Current에서 액세스 할 수있는 경우 HttpContext.Current에서 TempData에 액세스 할 수 없어야하는 이유는 무엇입니까? – BowserKingKoopa

0

다른 답변에 대한 귀하의 의견을 언급하면 ​​자신의 ITempDataProvider를 구현 한 다음 Controller를 재정 의하여이를 사용하십시오. 세션이 아닌 쿠키에 tempdata를 저장하는 Mvc3Futures의 CookieTempDataProvider 클래스를 살펴보고 이것이 가능한지 확인하십시오.

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

오히려 tempdata 저장 위치를 ​​변경하는 대신, 구현 가능한 SessionCookieTempDataProvider에서 상속 단순히 그것에 형태 보증 된 방법을 추가 할 수 있습니다.

1

자신의 디자인 결정으로 인해 컨텍스트 개체를 매개 변수로 전달하지 않고이 작업을 수행하려면 최소한 전역 정적 클래스에서 [ThreadStatic]을 사용할 수 있습니다. 이는 ThreadStatic 매개 변수에 의존해야하는 Property 액세스 멤버가 함수가 아니기 때문에 유용 할 수 있습니다.

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