none
Actualizar vista parcial desde la acción de un controlador. RRS feed

  • Pregunta

  • Hola, explico la situación. En el desarrollo de la aplicación MVC, en una de las vistas está formada por varias vistas parciales que se van actualizando en función de las selecciones de otras de las vistas parciales. Para esto no tengo problema ya que utilizo @Ajax.ActionLink, y se actualizan las vistas sin problemas.

    La duda está en como puedo actualizar alguna de las vistas parciales desde las acciones del controlador. Explico con más detalle:

    • En una de estas vistas parciales tengo varias operaciones que puedo seleccionar a través de un checkbox para borrar las seleccionadas, utilizo un formulario para enviar las operaciones seleccionadas a la acción del controlador y borrarlas, pero al intentar refrescar solamente la vista parcial, me sustituye la vista completa por la vista parcial.

    Supongo que se solucionaría el problema llamando desde la acción del controlador a algún método tipo @Ajax.ActionLink ¿Cómo podría solucionarlo?

    Muchas gracias

    miércoles, 13 de mayo de 2015 16:16

Respuestas

  • Si te he entendido bien tenemos.

    1.- Una vista parcial sobre la que se realizan cambios en checkboxes y se envían al controlador.

    2.- A la vuelta del controlador te sustituye la vista con la vista parcial.

    Entonces lo que debes hacer es una llamada ajax a tu acción de tu controlador y devolver la vista parcial (que no es más que HTML) y actualizar en la parte onsucess de tu llamada ajax  jquery, el html.

    Para ello puedes seguir este enlace.

    http://www.codeproject.com/Articles/748842/Rendering-a-Partial-View-and-JSON-Data-Using-AJAX

    @model JsonRenderingMvcApplication.Models.PublisherModel
    <script src="~/Scripts/jquery-1.7.1.min.js"></script>
    <script type="text/javascript"> 
       
        $(document).ready(function ()
        {
            $("#Id").change(function ()
            {
                 var id = $("#Id").val();
                 var booksDiv = $("#booksDiv");
                 $.ajax({
                     cache: false,
                     type: "GET",
                     url: "@(Url.RouteUrl("BookByPublisher"))",
                    data: { "id": id },
                    success: function (data)
                    {
                        booksDiv.html('');
                        booksDiv.html(data);
                    },
                    error: function (xhr, ajaxOptions, thrownError)
                    {
                        alert('Failed to retrieve books.');                    
                    }
                });
            });
        });      
    </script>
    <div>
        @Html.LabelFor(model=>model.Id)
        @Html.DropDownListFor(model => model.Id, Model.PublisherList)
    </div>
    <div id="booksDiv">
    </div>
    fijate que se lanza una llamada AJAX, en el controlador se devuelve una partial view y en el sucess de ajax se actualiza el html del div booksDiv con la vista parcial


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Ángel Rguez jueves, 14 de mayo de 2015 8:10
    jueves, 14 de mayo de 2015 6:24
    Moderador

Todas las respuestas

  • hola

    por lo que entiendo tienes vistas parciales anidadas ?  una partial que define cuales otras cargar

    o estan las partial todas al mismo nivel en una view ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 13 de mayo de 2015 17:29
  • Todas las vistas parciales están al mismo nivel en una view.

    Saludos

    miércoles, 13 de mayo de 2015 18:56
  • Hola Angel, has revisado si se carga correctamente los scripts de ajax?

    Te sugiero que, a manera de prueba, referencies los scripts en la vista principal (donde están incrustadas tus vistas parciales), pero directamente y no a través del archivo BundleConfig

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

    Eso en la cabecera de tu vista completa.

    Saludos



    • Editado Richof miércoles, 13 de mayo de 2015 22:46
    miércoles, 13 de mayo de 2015 22:44
  • hola

    algo que no entendi es esta parte " pero al intentar refrescar solamente la vista parcial, me sustituye la vista completa por la vista parcial."

    como seria ? porque parece un trabalenguas

    podrias poner un ejemplo de como defines los Ajax.BeginForm() para que una vista realice acciones sobre otra ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 14 de mayo de 2015 0:38
  • Si te he entendido bien tenemos.

    1.- Una vista parcial sobre la que se realizan cambios en checkboxes y se envían al controlador.

    2.- A la vuelta del controlador te sustituye la vista con la vista parcial.

    Entonces lo que debes hacer es una llamada ajax a tu acción de tu controlador y devolver la vista parcial (que no es más que HTML) y actualizar en la parte onsucess de tu llamada ajax  jquery, el html.

    Para ello puedes seguir este enlace.

    http://www.codeproject.com/Articles/748842/Rendering-a-Partial-View-and-JSON-Data-Using-AJAX

    @model JsonRenderingMvcApplication.Models.PublisherModel
    <script src="~/Scripts/jquery-1.7.1.min.js"></script>
    <script type="text/javascript"> 
       
        $(document).ready(function ()
        {
            $("#Id").change(function ()
            {
                 var id = $("#Id").val();
                 var booksDiv = $("#booksDiv");
                 $.ajax({
                     cache: false,
                     type: "GET",
                     url: "@(Url.RouteUrl("BookByPublisher"))",
                    data: { "id": id },
                    success: function (data)
                    {
                        booksDiv.html('');
                        booksDiv.html(data);
                    },
                    error: function (xhr, ajaxOptions, thrownError)
                    {
                        alert('Failed to retrieve books.');                    
                    }
                });
            });
        });      
    </script>
    <div>
        @Html.LabelFor(model=>model.Id)
        @Html.DropDownListFor(model => model.Id, Model.PublisherList)
    </div>
    <div id="booksDiv">
    </div>
    fijate que se lanza una llamada AJAX, en el controlador se devuelve una partial view y en el sucess de ajax se actualiza el html del div booksDiv con la vista parcial


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Ángel Rguez jueves, 14 de mayo de 2015 8:10
    jueves, 14 de mayo de 2015 6:24
    Moderador
  • Hola Angel, has revisado si se carga correctamente los scripts de ajax?

    Te sugiero que, a manera de prueba, referencies los scripts en la vista principal (donde están incrustadas tus vistas parciales), pero directamente y no a través del archivo BundleConfig

    <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

    Eso en la cabecera de tu vista completa.

    Saludos



    Hola, no es un problema de carga. Quiero llamar a la actualización de una vista parcial desde la acción de un controlador y no se que pasos debo seguir.

    Un saludo

    jueves, 14 de mayo de 2015 8:37