2011-10-30 5 views
3

ActionResult를 반환하는 컨트롤러 메서드를 만든 다음 끝에 View()를 호출하면 ViewResult에서 반환 된 결과가 PartialViewResult 기반의 ViewResult로 반환되도록 필터 (또는 시뮬레이션) 요청 조건에?MVC3 : 동작 자체의 코드 외부에서 결과 유형을 변경할 수 있습니까?

분명히 ViewResult 또는 PartialViewResult를 반환하는 컨트롤러 메서드 자체에 코드를 포함 할 수 있지만이 코드는 여러 곳에서 제공되므로 필터를 잘 사용하는 것처럼 보입니다. IResultFilter의 두 메서드에서이 작업을 시도해 본 결과 출력이 변경되지 않았습니다.

이것이 가능하지 않다면 기본 컨트롤러에 View 대신 호출 할 수있는 ViewOrPartial과 같은 몇 가지 메서드를 만드는 방법을 살펴 보겠습니다. 그러나 필터를 포기하기 전에 더 넓은 지혜를 찾고 싶습니다. 그것) 접근법.

감사합니다, 마태 복음

업데이트 : 그래서 지금 대린의 코드를 기반으로하고있다 내가 시도했던 어떤 사이에 적어도 하나 개의 차이가 나는 OnResultExecuting을 무시했다는 것 같습니다 (그리고 나는 또한 OnResultExecuted을 시도했다) Darin의 코드는 OnActionExecuted를 재정의합니다. 이상하게 보입니까 아니면 다른 것을 바라 볼까요? 작동하게되어 기쁘지만 IResultFilter 인터페이스에 연결하는 것이 더 합리적이라고 생각됩니다. 두 인터페이스의 의도를 더 자세히 살펴 봐야 할 것입니다.

+0

! 누군가가 해결책을 제시 할 수 있기를 바랍니다. – Jared

+0

절대적으로 'IActionFilter' 또는'IResultFilter'를 사용하여 결과를 변경할 수 있습니다. 그것을 적용하는 것을 기억 했습니까? 작동하지 않는 코드를 게시 할 수 있습니까? – Aaronaught

+0

어리 석음 나는 그것을 삭제했다. 나는 Darin의 코드에서 작업하고 있지만, 내가 잘못한 것을 알지 못한다고 혼잣말을한다. –

답변

9

네, 가능합니다 :

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result; 
     var viewResult = result as ViewResult; 
     var someValue = filterContext.Controller.ValueProvider.GetValue("someValue"); 
     if (viewResult != null && someValue != null && someValue.AttemptedValue == "foo") 
     { 
      // if the controller action returned a view result 
      // and the someValue parameter equals foo we replace the 
      // view result initially returned by the action by a 
      // partial view result 
      var partialResult = new PartialViewResult(); 
      partialResult.ViewData.Model = viewResult.Model; 
      filterContext.Result = partialResult; 
     } 
    } 
} 

은 그런 장식 : 나는 MVC3를 사용하기 시작하고 정말 대답에 관심이있을 것

[MyActionFilter] 
public ActionResult Foo() 
{ 
    MyViewModel vm = ... 
    return View(vm); 
} 
+1

+1, @Darin,'ActionFilter'와'ViewResultBase'의 커스텀 파생물에 대해 어떻게 생각하십니까? – smartcaveman

+1

@smartcaveman, 나는 확실히 말할 수있는 충분한 컨텍스트가 없지만 사용자 지정 작업 결과는 좋은 생각처럼 보입니다. 물론 OP의 컨텍스트가 충분하지 않으면 말할 수 없습니다. 더 나은 해결책이있을 수도 있습니다. 그것은 SO에 관한 대부분의 질문에 대한 문제입니다. OP는 자신의 시나리오와 목표를 충분히 설명하지 못하며 그렇게하지 않으면 더 나은 답변을 누락시킬 수 있습니다. OP는 그가 행동에서 결과를 바꾸고 싶어한다고 말했지만, 어떤 목적으로 그것이 명확하지 않은지 이야기했다. –

+0

더 많은 문맥을 제공하기 위해 행복합니다. "프로그레시브 향상"방식으로 내 응용 프로그램을 수행하려면 많은 작업이 기본적으로 전체 페이지를 반환하지만 jquery UI 대화 상자에서 javascript를 사용하도록 설정하면 렌더링됩니다. 이 경우 전체 html 페이지는 필요 없으며 스 니펫 만 필요합니다. 앞으로 더 많은 맥락을 제공하기 위해 노력할 것입니다. Darin의 코드가 작동했으며 내 방식이 꽤 비슷했습니다 (대신 ResultFilter를 사용함). 내가 질문을 게시하기 전에 나는 그것을 어리석게 삭제했다. 그래서 나는 지금 내가 잘못한 것을 확실히 말하지 않을 것이다. –

관련 문제