Estoy aprendiendo sobre la mejora progresiva y tengo una pregunta sobre las vistas AJAXifying. En mi proyecto MVC 3 tengo una página de diseño, una página de inicio de vista y dos vistas simples.
La página viewstart está en la raíz de la carpeta Vistas y, por lo tanto, se aplica a todas las vistas. Especifica que todas las vistas deben usarse _Layout.cshtml
para su página de diseño. La página de diseño contiene dos enlaces de navegación, uno para cada vista. Los enlaces se utilizan @Html.ActionLink()
para representarse en la página.
Ahora he agregado jQuery y quiero secuestrar estos enlaces y usar Ajax para cargar su contenido en la página dinámicamente.
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
Hay dos formas en que puedo pensar para hacer esto, pero no me gusta ninguna de las dos:
1) Puedo tomar todo el contenido de la Vista y colocarlo en una vista parcial, luego hacer que la vista principal llame a la vista parcial cuando se procesa. De esa manera, usando Request.IsAjaxRequest()
el controlador, puedo devolver View()
o regresar en PartialView()
función de si la solicitud es o no una solicitud de Ajax. No puedo devolver la vista normal a la solicitud de Ajax porque luego usaría la página de diseño y obtendría una segunda copia de la página de diseño inyectada. Sin embargo, no me gusta esto porque me obliga a crear vistas vacías con solo una @{Html.RenderPartial();}
en ellas para las solicitudes GET estándar.
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
Luego, en Index.cshtml, haga esto:
@{Html.RenderPartial("partialView");}
2) Puedo eliminar la designación de diseño de _viewstart y especificarla manualmente cuando la solicitud NO es Ajax:
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
¿Alguien tiene una mejor sugerencia? ¿Hay alguna manera de devolver una vista sin su página de diseño? Sería mucho más fácil decir explícitamente "no incluir su diseño" si se trata de una solicitud ajax, que incluir explícitamente el diseño si no es un ajax.