2011-04-29 2 views
0

ajax 호출인지 여부에 따라 런타임에 마스터/레이아웃 페이지를 변경하는 작업 필터가 있습니다. 그러나 그것은 Ajax 호출 일 때 System.Web.HttpException을 발생시킵니다. 이 ActionFilter는 WebForms 엔진과 잘 작동하지만 razorengine을 사용하여 예외를 throw합니다. 예외 :ActionFilter.OnResultExecuting 중에 MasterName을 변경하면 예외가 발생합니다.

은 "RenderBody"방법은 레이아웃 페이지 "~/조회수 /가 XXXX/Empty.cshtml"

이 액션 필터가 요구되지 않은

:

public class AjaxActionFilterAttribute : ActionFilterAttribute 
{ 
    public string MasterPage { get; set; } 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != null 
      && filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
     { 
      var viewResult = filterContext.Result as ViewResult; 
      if (viewResult != null) 
      { 
       viewResult.MasterName = MasterPage; 
      } 
     } 
    } 
} 

이 내 작업이 표시됩니다 이 속성에 다음과 같이

[AjaxActionFilter(MasterPage = "Empty")] 
[AcceptVerbs(HttpVerbs.Get), ActionName("Index"), CollectionAction] 
public override ActionResult CollectionAction() 
{ 
    ... 
} 

편집 : 그리고 물론 내 레이아웃보기 인 Empty.cshtml은 다음과 같다 :

'비 아약스와보기를 치면
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head id="DefaultMasterHead"> 
     @RenderSection("styles", false) 
    </head> 
    <body> 
    <div> 
     @RenderBody() 
    </div> 
     @RenderSection("scripts", false) 
    </body> 
    </html> 

이 괜찮습니다하지만이 경우 아약스는 예외를 throw 전화를 호출합니다. 다시 말하지만, WebForms 엔진에서 올바르게 작동합니다.

여기에 무슨 일이 일어나는지 설명 할 수있는 사람이 있습니까?

TIA

+0

를 혹시이 작업나요? – joshcomley

+0

죄송합니다. Josh, 아직 없습니다. 아이러니하게도 MVC3으로 업그레이드 할 때 또 다른 문제를 해결하기 위해 면도기를 시험해 보았습니다. 필자는 원래의 렌더링 문제를 해결하기 위해 WebForm보기를 변경했습니다. 나는 아직 간단한 프로젝트에서 그것을 복제하지 않았다. 건배 Simon. –

답변

0

OnActionExecuted 대신 OnResultExecuting의를 무시하십시오 :

public class AjaxActionFilterAttribute : ActionFilterAttribute 
{ 
    public string MasterPage { get; set; } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     var result = filterContext.Result as ViewResult; 
     if (filterContext.HttpContext.Request.IsAjaxRequest() && result != null) 
     { 
      result.MasterName = MasterPage; 
     } 
    } 
} 
+0

감사합니다 Darin, 이것은 작동하지 않으므로 다른 MVC 프로젝트에서 시작하여 다른 간섭 요인을 배제하기 위해 시도해 볼 것입니다. 환호성 Simon –

관련 문제