Я узнал о Progressive Enhancement, и у меня есть вопрос об AJAXifying представлениях. В моем проекте MVC 3 у меня есть страница макета, страница просмотра и два простых вида.
Страница просмотра находится в корне папки "Представления" и, таким образом, применяется ко всем представлениям. Он указывает, что все представления должны использовать _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.