Я узнаю о прогрессивном улучшении, и у меня есть вопрос о взглядах 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();
}
Затем в Index.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.
Layout = ViewBag.LayoutFile
.Просто поместите следующий код в верхней части страницы
источник
Я предпочитаю и использую ваш вариант № 1. Мне не нравится № 2, потому что для меня
View()
подразумевается, что вы возвращаете всю страницу. Это должна быть полностью продуманная и действительная HTML-страница, как только с ней завершит работу механизм представления.PartialView()
был создан для возврата произвольных фрагментов HTML.Я не думаю, что важно иметь представление, которое просто вызывает частичное. Он все еще СУХОЙ, и позволяет вам использовать логику частичного в двух сценариях.
Многим не нравится фрагментировать маршруты вызовов своих действий
Request.IsAjaxRequest()
, и я могу это оценить. Но IMO, если все, что вы делаете, это решаете, звонитьView()
или нет,PartialView()
тогда отделение не имеет большого значения и его легко поддерживать (и тестировать). Если вы обнаружите, что используетеIsAjaxRequest()
большую часть того, как заканчивается ваше действие, то, вероятно, лучше сделать отдельное действие AJAX.источник
Создайте два макета: 1. пустой макет, 2. Основной макет, а затем записать в _viewStart файл этот код:
конечно, возможно это не лучшее решение
источник
Вам не нужно создавать пустое представление для этого.
В контроллере:
возвращение PartialViewResult переопределит определение макета при рендеринге ответа.
источник
В ASP.NET 5 больше нет переменной Request. Вы можете получить к нему доступ сейчас с помощью Context.Request
Также больше нет метода IsAjaxRequest (), вы должны написать его самостоятельно, например, в Extensions \ HttpRequestExtensions.cs
Я долго искал это и надеюсь, что это поможет и другим;)
Ресурс: https://github.com/aspnet/AspNetCore/issues/2729
источник
Для приложения Ruby on Rails я смог предотвратить загрузку макета, указав
render layout: false
в действии контроллера, на которое я хотел ответить с помощью ajax html.источник