MVC 3: Как отобразить представление без страницы макета при загрузке через ajax?



я узнаю о Постепенное Повышение и у меня есть вопрос об AJAXifying взглядов. В моем проекте MVC 3 у меня есть страница макета, страница просмотра и два простых вида.



страница viewstart находится в корне папки Views и, таким образом, применяется ко всем представлениям. Он указывает, что все представления должны использовать _Layout.cshtml для макета страницы. Страница макета содержит две навигационные ссылки, по одной для каждого вида. Ссылки используют @Html.ActionLink() чтобы представить себя страница.



теперь я добавил jQuery и хочу захватить эти ссылки и использовать Ajax для динамической загрузки их содержимого на страницу.



<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>


есть два способа, которые я могу придумать, чтобы сделать это, но мне не особенно нравится ни один из них:



1) я могу взять содержимое всего представления и поместить их в частичное представление, а затем вызвать частичное представление в главном представлении при его визуализации. Таким образом, используя Request.IsAjaxRequest() в контроллере, я могу вернуть View() или возврата PartialView() в зависимости от того, является ли запрос Ajax-запросом. Я не могу вернуть обычный вид в запрос Ajax, потому что тогда он будет использовать страницу макета, и я получу вторую копию страницы макета. Однако мне это не нравится, потому что это заставляет меня создавать пустые представления только с @{Html.RenderPartial();} в них для стандартных запросов GET.



    public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}


затем в индексе.cshtml сделать это:



@{Html.RenderPartial("partialView");}


2) я могу удалить обозначение макета из _viewstart и указать это вручную, когда запрос не Ajax:



    public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}


есть ли у кого-нибудь лучшее предложение? Есть ли способ вернуть представление без его страницы макета? Было бы намного проще явно сказать "не включать ваш макет", если это запрос ajax, чем явно включать макет, если это не ajax.

648   6  

6 ответов:

на ~/Views/ViewStart.cshtml:

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

и в контроллере:

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

просто поместите следующий код в верхней части страницы

@{
    Layout = "";
}

Я предпочитаю, и использовать, ваш вариант #1. Мне не нравится #2, потому что мне View() подразумевает, что вы возвращаете всю страницу. Это должна быть полностью конкретизированная и действительная HTML-страница, как только механизм просмотра будет выполнен с ней. PartialView() был создан для возврата произвольных фрагментов HTML.

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

многие люди не любят, фрагментирование пути вызова их действий с Request.IsAjaxRequest(), и я ценю это. Но ИМО, если все, что вы делаете, это решить, стоит ли звонить View() или PartialView() тогда ветка не имеет большого значения и проста в обслуживании (и тестировании). Если вы обнаружите, что используете IsAjaxRequest() чтобы определить большие части того, как ваше действие разыгрывается, то создание отдельного действия AJAX, вероятно, лучше.

создать два макета: 1. пустой макет, 2 . основной макет, а затем написать в _viewStart файл этот код:

@{
if (Request.IsAjaxRequest())
{
    Layout = "~/Areas/Dashboard/Views/Shared/_emptyLayout.cshtml";
}
else
{
    Layout = "~/Areas/Dashboard/Views/Shared/_Layout.cshtml";
}}

конечно, может быть, это не лучшее решение

вам не нужно создавать пустое представление для этого.

в контроллере:

if (Request.IsAjaxRequest())
  return PartialView();
else
  return View();

возврат PartialViewResult переопределит определение макета при отображении ответов.

для приложения Ruby on Rails я смог предотвратить загрузку макета, указав render layout: false в действии контроллера, которое я хотел ответить с помощью ajax html.

Comments

    Ничего не найдено.