Я дізнаюся про « Прогресивне вдосконалення», і у мене виникає питання про 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) Я можу взяти весь вміст Перегляду та розмістити їх у частковому перегляді, а потім матимуть головний вигляд викликати частковий вигляд, коли він відображається. Таким чином, використовуючи 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.