Ich lerne etwas über progressive Verbesserung und habe eine Frage zu AJAXifying-Ansichten. In meinem MVC 3-Projekt habe ich eine Layoutseite, eine Ansichtsstartseite und zwei einfache Ansichten.
Die Viewstart-Seite befindet sich im Stammverzeichnis des Views-Ordners und gilt daher für alle Views. Es gibt an, dass alle Ansichten _Layout.cshtml
für ihre Layoutseite verwendet werden sollen. Die Layoutseite enthält zwei Navigationslinks, einen für jede Ansicht. Die Links werden verwendet @Html.ActionLink()
, um sich selbst auf die Seite zu rendern.
Jetzt habe ich jQuery hinzugefügt und möchte diese Links entführen und Ajax verwenden, um ihren Inhalt dynamisch auf die Seite zu laden.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Es gibt zwei Möglichkeiten, wie ich mir das vorstellen kann, aber ich mag keine besonders:
1) Ich kann den gesamten Inhalt der Ansicht in eine Teilansicht einfügen und dann die Hauptansicht beim Rendern die Teilansicht aufrufen lassen. Auf diese Weise Request.IsAjaxRequest()
kann ich mithilfe des Controllers zurückgeben View()
oder zurückgeben PartialView()
, je nachdem, ob es sich bei der Anforderung um eine Ajax-Anforderung handelt oder nicht. Ich kann die reguläre Ansicht nicht an die Ajax-Anforderung zurückgeben, da dann die Layoutseite verwendet wird und eine zweite Kopie der Layoutseite eingefügt wird. Dies gefällt mir jedoch nicht, da ich gezwungen bin, leere Ansichten mit nur einem @{Html.RenderPartial();}
in ihnen für die Standard-GET-Anforderungen zu erstellen .
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Dann machen Sie in Index.cshtml Folgendes:
@{Html.RenderPartial("partialView");}
2) Ich kann die Layoutbezeichnung aus _viewstart entfernen und manuell angeben, wenn die Anforderung NICHT Ajax lautet:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Hat jemand einen besseren Vorschlag? Gibt es eine Möglichkeit, eine Ansicht ohne Layoutseite zurückzugeben? Es wäre viel einfacher, explizit zu sagen, dass Sie Ihr Layout nicht einschließen sollen, wenn es sich um eine Ajax-Anforderung handelt, als das Layout explizit einzuschließen, wenn es kein Ajax ist.