문제

적절한 ActionResult의 반환을 도우미 메서드로 오프로드할 수 있도록 현재 실행 중인 컨트롤러에 액세스하고 싶습니다.이를 위해 저는 ControllerContext.Current라고 생각했지만 그렇지 않은 것과 동등한 것을 찾고 있습니다.감사해요!

설명을 위해 편집: JavaScript 기반의 일반 양식 컨트롤이 있지만 noscript와 함께 작동하도록 옵션을 추가하고 싶습니다.현재 내 컨트롤러는 ViewData.Model을 JSON 기반 Models.FormResponse<T>로 설정합니다.

이 FormReponse는 게시물 상태와 생성된 오류 메시지로 설정되므로 스크립트/noscript 확인(숨겨진 양식 입력)을 수행하는 GetActionResult() 메서드가 필요합니다.

  1. 모델을 JSONed FormResponse로 설정하고 View()를 반환합니다. 또는
  2. 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를 얻을 수 있지만 핸들러가 사용하는 컨트롤러 인스턴스에 액세스할 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top