Asp.net MVC Hijaxing вернул вид исправления - PullRequest
0 голосов
/ 16 января 2012

Я пытаюсь использовать угон для создания одностраничного веб-приложения с использованием mvc.Проблема, которую я нахожу, заключается в том, как эффективно переключать компоновку, возвращаемую контроллером.

наиболее очевидным неэффективным решением было бы использование этого кода на каждом контроллере:

if (Request.IsAjaxRequest())
{
    return PartialView();
}
else
{
    viewdata["controller"]= "x"; viewdata["action"]= "y"; 
    return View("defaultview"); //I need view data because only one template main
                                //view is returned and based on the viewdata the main 
                                //view loads the right partial view inside it
}

Есть ли способ сделать приведенный выше код более простым способом?Возможно, используя пользовательский viewresult, который проверяет, является ли запрос AJAX, и возвращает правильное представление.Или, может быть, какой-то базовый контроллер?Я не знаю, как реализовать обе идеи, поэтому было бы замечательно любое руководство.

1 Ответ

2 голосов
/ 16 января 2012

Одна из возможностей - написать собственный фильтр действий и подписаться на событие OnActionExecuted. Внутри вы проверите, было ли действие вызвано с помощью AJAX-запроса и вернул ли он результат просмотра. В этом случае вы замените этот результат просмотра частичным результатом просмотра:

public class LayoutSelectorAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var result = filterContext.Result as ViewResult;
        if (filterContext.HttpContext.Request.IsAjaxRequest() && result != null)
        {
            var partialViewResult = new PartialViewResult
            {
                ViewName = result.ViewName,
                ViewData = result.ViewData,
                TempData = result.TempData
            };
            filterContext.Result = partialViewResult;
        }
    }
}

Теперь вы можете украшать свои контроллеры или действия этим атрибутом.

Если вы используете Razor view engine, другая возможность - настроить файл _ViewStart.cshtml, в котором определен макет:

@{
    Layout = !ViewContext.HttpContext.Request.IsAjaxRequest() 
        ? "~/Views/Shared/_Layout.cshtml" 
        : null;
}
...