我有一个动作过滤器,它根据是否是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
答案 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;
}
}
}