Я узнаю о Прогрессивном улучшении , и у меня возник вопрос о представлениях AJAXifying.В моем проекте MVC 3 у меня есть страница макета, страница Viewstart и два простых представления.
Страница 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) Я могу взять содержимое всего представления и поместить его в частичное представление, а затем получить основнойview вызывает частичное представление, когда оно отображается.Таким образом, используя 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.