Загрузите PartialView для AJAX и View для не AJAX-запроса - PullRequest
5 голосов
/ 03 июля 2011

Я хочу реализовать что-то вроде в Facebook:

  • после того, как левый клик на фото, он загружается через AJAX
  • , после среднего нажатия на прокрутку, он обычно загружается с дополнительной раскладкой

На данный момент у меня есть View, который загружается в контроллер двумя разными способами:

public ActionResult Overview()
{
    return View("Overview");
}

public ActionResult OverviewPartialView()
{
    return PartialView("Overview");
}

И в скрипте jquery это выглядит так:

$(contentContainer).load(_link + 'PartialView');

У меня вопрос: есть ли лучший способ решить эту проблему?Я пытался что-то подобное в _ViewStart:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    if (IsAjax)
    {
        Layout = null;
    }
}

И что-то подобное в Controller:

public ActionResult Index()
{
    if (Request.IsAjaxRequest())
        return PartialView();

    return View();
}

Но в этих решениях у меня была проблема с кешем, после открытия страницыс макетом, в AJAX-запросе также была загружена страница с макетом.

Ответы [ 2 ]

10 голосов
/ 03 июля 2011

Вы можете использовать одно действие:

public ActionResult Overview()
{
    return View();
}

и внутри _ViewStart.cshtml:

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

Другая возможность заключается в использовании следующего:

public ActionResult Overview()
{
    if (Request.IsAjaxRequest())
    {
        return PartialView();
    }
    return View();
}

затем, если вы хотите избежать проблем кеширования , вы можете использовать запрос POST вместо GET:

$.post(_link, function(result) {
    $(contentContainer).html(result);
});

или использовать $.ajax с GET и указать cache: false, который добавитуникальный параметр строки запроса, чтобы избежать кэширования в браузерах:

$.ajax({
    url: _link,
    type: 'GET',
    cache: false,
    success: function(result) {
        $(contentContainer).html(result);
    }
});
2 голосов
/ 11 августа 2013

Вы можете использовать полуглобальное решение с ActionFilter.В этом примере преобразовывается исходный ViewResult в PartialViewResult, если запрос имеет формат AJAX (XHR)

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AjaxifyFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if(!filterContext.HttpContext.Request.IsAjaxRequest() ||
            !(filterContext.Result is ViewResult)) return;

        var view = filterContext.Result as ViewResult;
        filterContext.Result = new PartialViewResult
        {
            TempData = view.TempData,
            ViewData = view.ViewData,
            ViewName = view.ViewName,
            ViewEngineCollection = view.ViewEngineCollection
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...