#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, чтобы исключить другие мешающие факторы. Приветствую Саймона