Dowiaduję się o Progressive Enhancement i mam pytanie dotyczące widoków AJAXifying. W moim projekcie MVC 3 mam stronę układu, stronę Viewstart i dwa zwykłe widoki.
Strona Viewstart znajduje się w katalogu głównym folderu Views, a zatem ma zastosowanie do wszystkich widoków. Określa, że wszystkie widoki powinny być używane _Layout.cshtml
na stronie układu. Strona układu zawiera dwa łącza nawigacyjne, po jednym dla każdego widoku. Linki służą @Html.ActionLink()
do wyświetlania się na stronie.
Teraz dodałem jQuery i chcę przejąć te linki i użyć Ajax do dynamicznego ładowania ich zawartości na stronie.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Są dwa sposoby, aby to zrobić, ale nie podoba mi się żaden z nich:
1) Mogę pobrać całą zawartość widoku i umieścić ją w częściowym widoku, a następnie wywołać widok częściowy w widoku głównym podczas renderowania. W ten sposób, używając Request.IsAjaxRequest()
w kontrolerze, mogę zwrócić View()
lub zwrócić w PartialView()
zależności od tego, czy żądanie jest żądaniem Ajax. Nie mogę zwrócić zwykłego widoku do żądania Ajax, ponieważ wtedy użyłby on strony układu i dostałbym drugą kopię wstrzykniętej strony układu. Jednak nie podoba mi się to, ponieważ zmusza mnie to do tworzenia pustych widoków z tylko jednym @{Html.RenderPartial();}
w nich dla standardowych żądań GET.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Następnie w Index.cshtml zrób to:
@{Html.RenderPartial("partialView");}
2) Mogę usunąć oznaczenie układu z _viewstart i określić je ręcznie, jeśli żądanie NIE jest Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Czy ktoś ma lepszą sugestię? Czy istnieje sposób na zwrócenie widoku bez strony układu? O wiele łatwiej byłoby wyraźnie powiedzieć „nie dołączaj swojego układu”, jeśli jest to żądanie AJAX, niż byłoby jawnie dołączyć układ, jeśli nie jest to AJAX.