2009-11-03 1 views
2

TempData는 단일 페이지 요청 사이에서만 작동하도록 설계되었습니다. 그러나 의도 한 기능을 손상시키는 상황이 있다고 생각합니다.TempData를 유지하도록 작업/컨트롤러에게 알리기

컨트롤러를 사용하여 이미지를 전송하기위한 처리기보다 처리기를 사용합니다. 나는 그것이 최선의 관행이라면 지금은 아니지만, 그것은 나를 위해 아주 잘 작동합니다. 그러나 문제는 이미지 액션 중 하나에 대한 각 호출이 분명히 TempData 크레딧을 사용한다는 것입니다.

MVC에서 "이 컨트롤러/동작이 일반 페이지 요청의 범위를 벗어났습니다."라는 말을 듣고 있으므로 TempData를 유지하거나 TempData 수명주기에서 완전히 제거 할 수 있습니까? 나 자신을 MVC 꽤 새로 온 사람으로

리치

+0

거의 확실하게 TempData를 오용하고 있습니다. TempData는 리디렉션 전용입니다. 리디렉션에 사용하면 이미지 요청에 HTML 요청 *이 * 와야하기 때문에 이미지는 문제가되지 않습니다. 이미지 요청이 TempData를 방해한다고 말하기 때문에 나는 리디렉션 컨텍스트 외부에서 사용하고 있다고 결론을 내립니다. 더 자세한 설명은 http://blogs.teamb.com/craigstuntz/2009/01/23/37947/을 참조하십시오. –

+0

답장을 보내 주셔서 감사합니다. 당신은 리디렉션에서 TempData를 사용하지 않는다는 점에서 맞지만 TempData가 리다이렉트 전용이라는 점에는 동의하지 않습니다. 나는 틀리게 입증하게 아주 행복하다, 그러나 나는 동일한 페이지 포스트 사이에서 자료를 통과하기 위하여 TempData을 사용하고있다. HTML에 정보를 포함시키지 않기 때문에 ViewData를 사용하고 싶지 않습니다. – kim3er

+0

그게 문제 야. 제가 위에서 말한 것에 대한 증거 한 가지는 당신이 현재하고있는 일이 효과가 없다는 사실입니다. 리디렉션의 경우에만 "다음"요청의 확실성이 있습니다. 유일한 안정적인 수정 프로그램은 TempData를 올바르게 사용하는 것입니다. –

답변

2

내 솔루션 페이지에 걸쳐 TempData를 지속 애트리뷰트를 만들 수있다 요청. 이에 대한 나의 초기 반응은 "yuck"이지만, TempData 라이프 사이클에서 Attribute로 장식 된 컨트롤러를 효과적으로 제외하려고합니다.

using System.Web.Mvc; 

namespace K3R.Web.Mvc.Filters { 
    public sealed class PersistTempDataAttribute : ActionFilterAttribute { 
     public PersistTempDataAttribute() { } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) { 
      var tempData = filterContext.Controller.TempData; 
      if (tempData == null || tempData.Count == 0) 
       return; 

      string[] keys = new string[tempData.Keys.Count]; 
      tempData.Keys.CopyTo(keys, 0); 
      foreach (var key in keys) 
       tempData[key] = tempData[key]; 
     } 
    } 
} 

더 나은 해결책에 대한 의견을 보내 주시면 감사하겠습니다.

리치

+0

컨트롤러 양식을 완전히 제외한다고 생각하지 않습니다. 수명주기가 가능합니다. PersistTempDataAttribute를 전체 컨트롤러 또는 단일 메서드에 적용 할 수 있습니다. "OnActionExecuting"메서드는 <실제 함수 이전에> 실행되고 실행됩니다. 그러나 단일 요청을 넘어 정보를 저장하는 것이 데이터베이스 나 다른 캐싱 시스템에 저장하는 것이 좋습니다. – Sebastian

+0

물론, 전적으로 동의합니다. Image Controller를 포함하여 TempData를 사용하는 기존 코드를 화나게하고 싶지 않았습니다. 이미지와 같은 보조 아이템을 전달하기 위해 별도의 컨트롤러를 사용하는 것이이 시나리오에서 가장 좋은 옵션이 아닐 수는 있음을 인정합니다. – kim3er

+1

MVC2에서 TempData가 작동하도록 변경되었습니다. 데이터가 사용될 때까지 계속 유지됩니다. – kim3er

0

나는이에 대한 정확한 답변 모르겠어요. 그러나 AJAX 요청에 문제가있는 사람들이 TempData를 죽이기 전에 TempData를 죽이는 것에 대해 들어 봤습니다.

이 정보를 저장하기 위해 자체 세션 기반 시스템을 구현할 수 있으십니까?

다른 사람이 당신을 위해 좀 더 완벽한 답변을 제공 할 것이라고 확신합니다.

+0

이미 TempData를 사용하는 워크 플로우에 이미지 컨트롤러를 추가하고 있습니다. 배를 흔든다. 이러한 이유로 TempData를 유지하는 특성을 사용하고 있습니다. 이것은 TempData의 목적에 어긋나는 것이지만, Helper Controllers는 특별한 경우라고 생각합니다. 도움 주셔서 감사합니다. – kim3er

-1

나는 그것을하는 당신의 방법을 이해하지 못합니다. 왜 그랬는지는 잘 모르겠지만, 나는 핸들러와 함께 가고 싶습니다. 또는 컨트롤러 동작을 고수한다면, 즉석에서 이미지를 전달할 때 아무런 문제가없이 잘 처리되었다고 말할 수 있으며 컨트롤러 동작에 FileContentResult를 사용했습니다. 이처럼

:

 return File(imageBytes, imageType); 

당신은 바이트 데이터 저장소 중 또는 어딘가 ..

도움이되기를 바랍니다
+0

Image Action이 작동하고 있습니다. 관심있는 TempData에 대한 Action의 영향입니다. – kim3er