Изменение имени мастера во время ActionFilter.OnResultExecuting вызывает исключение

#asp.net-mvc-3 #razor

#asp.net-mvc-3 #razor

Вопрос:

У меня есть фильтр действий, который изменяет страницу master / layout во время выполнения в зависимости от того, является ли это вызовом ajax. Однако он запускает исключение System.Web.HttpException, когда это вызов Ajax. Этот ActionFilter отлично работает с движком WebForms, но выдает исключение с razorengine. Исключение:

Метод «RenderBody» не был вызван для страницы макета «~/Views/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
            amp;amp; filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            var viewResult = filterContext.Result as ViewResu<
            if (viewResult != null)
            {
                viewResult.MasterName = MasterPage;
            }
        }
    }
}
  

Мое действие помечено этим атрибутом следующим образом:

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

РЕДАКТИРОВАТЬ: и, конечно, мой вид макета, являющийся пустым.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. Вы когда-нибудь заставляли это работать?

2. Извини, Джош, я еще не сделал. По иронии судьбы, я опробовал razor, чтобы попытаться обойти другую проблему, возникшую у меня при обновлении до MVC3. В итоге я просто изменил свои представления веб-формы, чтобы обойти мою первоначальную проблему с рендерингом. Я еще не реплицировал его в простом проекте. Приветствую Саймона.

Ответ №1:

Попробуйте переопределить 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 ViewResu<
        if (filterContext.HttpContext.Request.IsAjaxRequest() amp;amp; result != null)
        {
            result.MasterName = MasterPage;
        }
    }
}
  

Комментарии:

1. Спасибо, Дарин, это не сработало, поэтому я думаю, что попробую и посмотрю, смогу ли я повторить это, начиная с пустого проекта MVC, чтобы исключить другие мешающие факторы. Приветствую Саймона