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.
Layout = ViewBag.LayoutFile
.Simplemente ponga el siguiente código en la parte superior de la página
fuente
Prefiero y uso tu opción n. ° 1. No me gusta el n. ° 2 porque para mí
View()
implica que está devolviendo una página completa. Debería ser una página HTML completamente desarrollada y válida una vez que el motor de visualización haya terminado con ella.PartialView()
fue creado para devolver fragmentos arbitrarios de HTML.No creo que sea un gran problema tener una vista que solo llame parcial. Todavía está SECO y le permite usar la lógica del parcial en dos escenarios.
A muchas personas no les gusta fragmentar las rutas de llamadas de su acción
Request.IsAjaxRequest()
, y puedo apreciar eso. Pero en mi opinión, si todo lo que está haciendo es decidir si llamarView()
o noPartialView()
, la sucursal no es un gran problema y es fácil de mantener (y probar). Si te encuentras usandoIsAjaxRequest()
para determinar grandes porciones de cómo se desarrolla tu acción, probablemente sea mejor hacer una acción AJAX por separado.fuente
Cree dos diseños: 1. diseño vacío, 2. diseño principal y luego escriba en el archivo _viewStart este código:
por supuesto, tal vez no sea la mejor solución
fuente
No tiene que crear una vista vacía para esto.
En el controlador:
devolver un PartialViewResult anulará la definición del diseño al representar la respuesta.
fuente
Con ASP.NET 5 ya no hay ninguna variable de solicitud disponible. Puede acceder a él ahora con Context.Request
Además, ya no existe el método IsAjaxRequest (), debe escribirlo usted mismo, por ejemplo en Extensions \ HttpRequestExtensions.cs
Busqué por un tiempo en esto y espero que también ayude a otros;)
Recurso: https://github.com/aspnet/AspNetCore/issues/2729
fuente
Para una aplicación Ruby on Rails, pude evitar que se cargara un diseño especificando
render layout: false
en la acción del controlador que quería responder con ajax html.fuente