Я узнаю о прогрессивном улучшении, и у меня есть вопрос о взглядах 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.