Автоматически отображать частичную часть при отправке запроса через ajax - PullRequest
2 голосов
/ 26 ноября 2010

Я пытаюсь выяснить, как я могу автоматически визуализировать представление как частичное (без главной страницы), когда запрос выполняется через ajax.

Чего я хочу избежать, так это использовать следующий код в каждом методе контроллера, который может возвращать ajax (поскольку это не очень СУХОЙ):

return Request.IsAjaxRequest() ? PartialView(model) : View(model)

Моей первой мыслью было добавить проверку в мой базовый контроллер методом View. Но метод view возвращает View (который PartialView не наследуется). Так что это не удалось.

Моя следующая попытка состояла в том, чтобы попытаться выполнить проверку в моем пользовательском механизме просмотра бритвы и просто удалить главную страницу, если это запрос ajax. Но и это не удалось.

Что я могу сделать, это создать новый метод ViewOrPartial, который содержит проверку и, соответственно, вернуть результат.

Как бы вы это сделали?

Ответы [ 4 ]

8 голосов
/ 26 ноября 2010

Как насчет размещения следующего:

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

в вашем ~/Views/_ViewStart.cshtml и в вашем действии контроллера, просто возвращающем представление:

return View(model);

Все виды бритвы используют _ViewStart.cshtml. Здесь указывается главная страница. Таким образом, при внесении этого изменения все представления автоматически применят главную страницу только условно, если запрос не был запросом AJAX. Довольно СУХОЙ.

0 голосов
/ 08 апреля 2014

На практике я обнаружил, что IsAjaxRequest не является надежным на 100%.

При большом количестве запросов с мобильного устройства оно иногда возвращало бы false при вызове Ajax.

Я заканчивал тем, что добавил параметр строки запроса (например, частичный = 1) в мои запросы Ajaxчтобы убедиться, что контроллер не был обманут.Это было около MVC 4, поэтому, возможно, с тех пор его можно было исправить, но я не могу позволить себе рискнуть.

В моем базовом контроллере (унаследованном всеми моими контроллерами) я добавил это:

public bool IsPartialPageRequest
{
    get
    {
        return Request.IsAjaxRequest() || !string.IsNullOrEmpty(Request["partial"]);
    }
}

В контроллерах у меня тогда есть что-то вроде:

    if (!base.IsPartialPageRequest)
    {
        ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
    }

И, наконец, в моих взглядах у меня есть:

@{
    Layout = ViewBag.Layout;
}

Я гарантирую, что всегда добавляю &partial=1 к своему Ajaxзапросы (на всякий случай), и это было на 100% надежно с тех пор.

0 голосов
/ 26 ноября 2010
0 голосов
/ 26 ноября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...