ASP.NET MVC의 HttpContext.Current에 해당하는 컨트롤러
-
11-09-2019 - |
문제
적절한 ActionResult의 반환을 도우미 메서드로 오프로드할 수 있도록 현재 실행 중인 컨트롤러에 액세스하고 싶습니다.이를 위해 저는 ControllerContext.Current라고 생각했지만 그렇지 않은 것과 동등한 것을 찾고 있습니다.감사해요!
설명을 위해 편집: JavaScript 기반의 일반 양식 컨트롤이 있지만 noscript와 함께 작동하도록 옵션을 추가하고 싶습니다.현재 내 컨트롤러는 ViewData.Model을 JSON 기반 Models.FormResponse<T>로 설정합니다.
이 FormReponse는 게시물 상태와 생성된 오류 메시지로 설정되므로 스크립트/noscript 확인(숨겨진 양식 입력)을 수행하는 GetActionResult() 메서드가 필요합니다.
- 모델을 JSONed FormResponse로 설정하고 View()를 반환합니다. 또는
- FormResponse를 세션에 직렬화하고 Redirect()를 반환합니다.
이는 분명히 반환 값을 변경하고 매번 직접 확인하고 싶지 않으므로 이를 다음과 같이 호출하려면 FormResponse의 GetActionResult 메서드에서 View 또는 Redirect를 호출해야 합니다.
return formResponse.GetActionResult();
좀 더 우주적인 디자인을 사용하면 이것이 더욱 강력해질 수 있다는 것을 알고 있지만 noscript 옵션은 현재 주요 기능이 아니기 때문에 다른 것을 손상시키지 않는 빠른 솔루션을 얻으면 됩니다.
업데이트 #2
ActionResult 클래스에 구현된 다음은 나를 위해 작업을 수행합니다.CVertex님, 감사합니다!
public override void ExecuteResult(ControllerContext context)
{
if (CMSEnvironment.NoScript)
{
Oracle.Response.Redirect(Oracle.Request.UrlReferrer.ToString(), true);
}
context.Controller.ViewData.Model = _model.ToJSON();
new ViewResult()
{
ViewName = Areas.Site.Helpers.SharedView.Service,
ViewData = context.Controller.ViewData
}.ExecuteResult(context);
}
해결책
정적은 테스트 가능성에 좋지 않으며 MVC에서는 매우 권장되지 않습니다.
현재 컨트롤러 및 작업 메서드에 액세스하려는 이유는 무엇입니까?
이를 수행하는 가장 좋은 방법은 다음과 같습니다. 자신만의 ActionFilter 구현.이는 작업 메서드가 실행되기 전이나 후에 요청을 가로채는 수단을 제공합니다.
편집하다:필터의 OnActionExecuted 내에서 결과를 가로채서 noscript/script 검사를 수행하고 뷰에서 사용할 수 있도록 ViewData를 적절하게 수정할 수 있습니다.OnActionExecuted 내에서 noscript 검사를 수행하고 원하는 대로 최종 ActionResult 또는 ViewData를 완벽하게 제어할 수도 있습니다.
또는 이러한 모든 결정을 내리는 자체 ActionResult를 작성할 수 있습니다.따라서 컨트롤러 작업은 궁극적으로
return new MyActionResult(format_and_view_agnostic_model_object);
다른 팁
스레드에서 현재 컨트롤러로 이동하는 방법은 없는 것 같습니다.즉, ControllerBuilder를 얻을 수 있고 MvcHttpHandler를 얻을 수 있지만 핸들러가 사용하는 컨트롤러 인스턴스에 액세스할 수는 없습니다.