Sto imparando su Progressive Enhancement e ho una domanda sulle opinioni AJAXifying. Nel mio progetto MVC 3 ho una pagina di layout, una pagina viewstart e due viste semplici.
La pagina viewstart si trova nella radice della cartella Viste e quindi si applica a tutte le viste. Specifica che tutte le viste devono essere utilizzate _Layout.cshtml
per la loro pagina di layout. La pagina di layout contiene due collegamenti di navigazione, uno per ogni vista. I collegamenti utilizzano @Html.ActionLink()
per renderizzare se stessi alla pagina.
Ora ho aggiunto jQuery e voglio dirottare questi collegamenti e usare Ajax per caricare dinamicamente i loro contenuti sulla pagina.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Ci sono due modi in cui posso pensare di farlo, ma non mi piace particolarmente uno dei due:
1) Posso prendere l'intero contenuto della Vista e posizionarli in una vista parziale, quindi la vista principale può chiamare la vista parziale quando viene visualizzata. In questo modo, utilizzando Request.IsAjaxRequest()
nel controller, posso tornare View()
o tornare in PartialView()
base alla richiesta o meno di una richiesta Ajax. Non riesco a restituire la visualizzazione normale alla richiesta Ajax perché in tal caso utilizzerebbe la pagina di layout e verrebbe iniettata una seconda copia della pagina di layout. Tuttavia, non mi piace perché mi costringe a creare viste vuote con solo un @{Html.RenderPartial();}
in esse per le richieste GET standard.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Quindi in Index.cshtml fai questo:
@{Html.RenderPartial("partialView");}
2) Posso rimuovere la designazione del layout da _viewstart e specificarla manualmente quando la richiesta NON è Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
Qualcuno ha un suggerimento migliore? C'è un modo per restituire una vista senza la sua pagina di layout? Sarebbe molto più facile dire esplicitamente "non includere il layout" se si tratta di una richiesta Ajax, piuttosto che includere esplicitamente il layout se non è un Ajax.