Estoy aprendiendo sobre Mejora Progresiva y tengo una pregunta acerca de AJAXifying vistas. En mi MVC 3 proyecto tengo una página de diseño, un viewstart página, y dos llanura vistas.

La viewstart página está en la raíz de la carpeta Views y por lo tanto se aplica a todos los puntos de vista. Se especifica que todos los puntos de vista deben utilizar _Layout.cshtml para su diseño de página. El diseño de la página contiene dos enlaces de navegación, uno para cada vista. Los enlaces de @Html.ActionLink() para generarse a sí mismos a la página.

Ahora he añadido jQuery y quieren apropiarse de estos vínculos y uso de Ajax para cargar su contenido en la página de forma dinámica.

<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 maneras en las que puedo pensar para hacer esto, pero no me gusta especialmente uno:

1) puedo tomar toda la Vista del contenido y el lugar en una vista parcial, entonces la vista principal de la llamada de la vista parcial cuando se haya procesado. De esa manera, el uso de Request.IsAjaxRequest() en el controlador, puedo volver View() o retorno PartialView() en función de si o no la solicitud es una petición Ajax. No puedo volver a la vista normal a la petición Ajax, porque entonces se podría utilizar el diseño de página y me gustaría obtener una segunda copia de la página de diseño inyectado. Sin embargo, no me gusta porque me obliga a crear vacío puntos de vista con sólo un @{Html.RenderPartial();} en ellos para el estándar de peticiones GET.

    public ActionResult Index()
    {
        if (Request.IsAjaxRequest())
            return PartialView("partialView");
        else
            return View();
    }

A continuación, en el Índice.cshtml hacer esto:

@{Html.RenderPartial("partialView");}

2) me puede quitar el diseño de la designación de _viewstart y especificar de forma manual 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 idea mejor? Es allí una manera de devolver una vista sin su diseño de página? Sería mucho más fácil decir explícitamente «no incluyen su diseño» si es una petición ajax, que sería incluir explícitamente el diseño, si no es ajax.

InformationsquelleAutor Chev | 2011-03-15

7 Comentarios

  1. 253

    En ~/Views/ViewStart.cshtml:

    @{
        Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_Layout.cshtml";
    }

    y en el controlador:

    public ActionResult Index()
    {
        return View();
    }
    • Este puede ser especificado en el viewstart?
    • absolutamente, he actualizado mi respuesta.
    • Ewww, que se siente feo para mí. Mi viewstart página es acerca de la última página, me gustaría esperar algún tipo de lógica que se encuentra.
    • Greer, usted lo llama desagradable, yo lo llamo SECO, subjetiva cosas de todos modos 🙂
    • Tengo que admitir que no me gustó al principio, pero la cantidad de código que guarda parecería mucho outweight es baja. Es un simple valor booleano si y realmente no imponer mucho de la OMI. Me gusta mejor que picar mis métodos de acción en la mitad de cada hora. Además de que me impide hacer lo que dijo Matt y, potencialmente, bajando dos gigantes de los caminos de la lógica en el método de acción. Yo tampoco escribir la acción para el trabajo de la misma en ambos casos, o escribir una nueva acción.
    • no podía hacerlo en un controlador de base, establecer una propiedad en el ViewData y el uso que? A continuación, la línea sería Layout = ViewBag.LayoutFile.
    • Supongo que podría, pero realmente ¿por qué crear un baseController para un poco de la línea?
    • Esto no funcionará si la vista intenta inyectar contenido en un @section
    • Es allí una manera de configurar esto en el cotroller?
    • sí, hay una manera, usted podría utilizar el correcto sobrecarga del método Ver, que le permite especificar el diseño de la devolución del ViewResult.
    • Esto funciona muy bien PERO hay una manera de sólo ocultar el encabezado, pero mostrando la parte de pie de página del archivo de diseño?
    • que mucho de esto, yo estaba haciendo un ajax post y usa return View() como se dijo here; pero mis contenidos se actualizan con el diseño , pero esto se ha solucionado el problema. tengo una pregunta , es normal post con @UrlAction vs Ajax post que es rápido para devolver un punto de vista ?
    • ver mi respuesta
    • Creo que de esta forma se rompe la separación de los intereses principio, una visión no debería estar preocupado acerca de la forma en que se dicte. El controlador en el otro lado tiene toda la información necesaria para decidir qué y cómo procesar sus resultados.

  2. 89

    Sólo hay que poner el siguiente código en la parte superior de la página

    @{
        Layout = "";
    }
    • Esto no funciona porque quiero ser capaz de cambiar el diseño o desactivar dependiendo de si es o no es solicitada a través de AJAX. Esto sólo le permite apagar el diseño, no cambiarlo.
    • Por qué esto tiene Voto de ups ?? pls explicar, así que voy a votar hasta que es demasiado .
    • Usted no necesita el voto de seguridad. Pero yo sí. Mi arguemnt ir a google.com.pk/#q=mvc3%20view%20without%20layout . Y es la respuesta perfecta a esa consulta.
    • El tema es acerca de cambiar el diseño en dos escenarios diferentes. Esta respuesta sólo del conjunto de la disposición a vacío, no importa lo que es el escenario.
    • Amigo, esto funciona y es realmente agradable. El escenario de uso: El usuario no autorizado intenta ingresar, uno no quiere que la página de error para mostrar los enlaces y así sucesivamente para un usuario no autorizado! Por supuesto, funciona para todo lo demás también!
    • Véase el comentario de arriba
    • He aquí por qué he upvoted es: tengo 2 páginas independientes, uno para la interfaz de usuario, uno para ajax consultas. Y en la página de ajax no necesito la masterpage Diseño. Ahora, en VS2013 UPD4 puede quitar simplemente que «Layout = algo» de la línea, y desaparece. Pero en VS2013 REL1 no es suficiente. El materpage diseño se incluye, incluso, la línea no está allí. Así, implícitamente ajustar «Layout = «» ayudó en mi situación. Que también dice «si quieres para que este código funcione 100% de uso de Layout =» cada vez que usted realmente desea ocultar.». P. S. no tengo opción de que VS a utilizar. Decisión del cliente 🙁
    • Esto podría no responder a la pregunta del OP, pero me upvoted de todos modos, porque respondía a la pregunta que necesitaba respondió.
    • Google me llevó a esta respuesta en particular cuando le pregunté cómo evitar que los diseños de la carga de vistas parciales, debido a que los diseños predeterminado incluido jquery cargas que estaban causando el infame «no se puede llamar a los métodos de diálogo antes de la inicialización; intentó llamar a método abierto» en mis vistas parciales utilizando en los diálogos. es por eso que me upvoted la respuesta.

  3. 13

    Prefiero y uso, su #1 opción. No me gusta #2 porque me View() implica que están regresando de una página entera. Debe ser totalmente consistentes y válidos página HTML una vez que el motor de la vista se hace con ella. PartialView() fue creado para volver arbitraria trozos de HTML.

    Yo no creo que sea un gran problema para tener un punto de vista de que sólo llama a un parcial. Todavía SECO, y permite el uso de la lógica de los parciales en dos escenarios.

    Muchas personas rechazan la fragmentación de su acción la llamada de caminos con Request.IsAjaxRequest(), y puedo apreciar que. Pero la OMI, si todo lo que están haciendo es decidir si llamar a la View() o PartialView() luego la rama no es un gran problema y es fácil de mantener (y prueba). Si usted se encuentra utilizando IsAjaxRequest() para determinar grandes porciones de cómo su acción se desempeña, a continuación, hacer un aparte acción AJAX es probablemente mejor.

  4. 13

    Crear dos maquetación: 1. vacío de diseño, 2 . principal de diseño y, a continuación, escribir en _viewStart archivo de este código:

    @{
    if (Request.IsAjaxRequest())
    {
        Layout = "~/Areas/Dashboard/Views/Shared/_emptyLayout.cshtml";
    }
    else
    {
        Layout = "~/Areas/Dashboard/Views/Shared/_Layout.cshtml";
    }}

    por supuesto, tal vez no es la mejor solución

  5. 7

    Usted no tiene que crear una vista vacía para esto.

    En el controlador:

    if (Request.IsAjaxRequest())
      return PartialView();
    else
      return View();

    la devolución de un PartialViewResult anulará la definición de diseño cuando la representación de la respons.

  6. 1

    Con ASP.NET 5 no hay ninguna Solicitud de variables disponibles más. Puedes acceder ahora con el Contexto.Solicitud de

    También que no hay IsAjaxRequest() el Método más, usted tiene que escribir por sí mismo, por ejemplo en las Extensiones de\HttpRequestExtensions.cs

    using System;
    using Microsoft.AspNetCore.Http;
    
    namespace Microsoft.AspNetCore.Mvc
    {
        public static class HttpRequestExtensions
        {
            public static bool IsAjaxRequest(this HttpRequest request)
            {
                if (request == null)
                {
                    throw new ArgumentNullException(nameof(request));
                }
    
                return (request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest");
            }
        }
    }

    He buscado desde hace un tiempo en esto y espero que pueda ayudar a los demás también 😉

    De recursos: https://github.com/aspnet/AspNetCore/issues/2729

  7. -4

    Para una aplicación de Ruby on Rails, yo era capaz de prevenir un diseño de carga mediante la especificación de
    render layout: false en la acción del controlador que he querido responder con ajax html.

    • etiquetas: c# asp.net, no ruby

Dejar respuesta

Please enter your comment!
Please enter your name here