在ActionFilter.OnResultExecuting期间更改MasterName会引发异常

时间:2011-04-29 05:32:10

标签: asp.net-mvc-3 razor

我有一个动作过滤器,它根据是否是ajax调用在运行时更改主/布局页面。但是,当它是Ajax调用时,它会触发System.Web.HttpException。 这个ActionFilter可以在WebForms引擎中正常工作,但是在razorengine中抛出异常。 例外:

尚未为布局页面“〜/ Views / xxxx / Empty.cshtml”调用“RenderBody”方法

动作过滤器:

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>

如果我使用非Ajax调用来访问视图,那么它很好,但如果是Ajax调用,它会抛出异常。再说一遍,正如我所说,它可以正常使用WebForms引擎。

任何人都可以解释这里会发生什么吗?

TIA

1 个答案:

答案 0 :(得分: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;
        }
    }
}