none
Actualizar el modelo de datos de una vista / recargar una vista con un modelo diferente RRS feed

  • Pregunta

  • Saludos,

    Les explico el problema, tengo una app en la que se genera un formulario que se carga desde una plantilla que se genera en memoria, no se encuentra almacenada en la base de datos. Al cargar el formulario este se le pueden editar las preguntas e items, no obstante, al ejecutar la edición o eliminación de una pregunta y sus items, la página no actualiza el modelo, sino que sigue utilizando el mismo modelo con el que se cargo inicialmente.

    He intentado utilizar dos controllers (con nombre igual pero diferentes parámetros) para redireccionar la página, sin embargo, necesito enviarle el modelo para que se actualice la vista con la información nueva (sea que se eliminó o modificó una pregunta), pero me encuentro con un error que indica que no encuentra el controlador o solo utiliza uno de los dos. Por ejemplo lo siguiente:

    public ActionResult Create(string template)
    {
         Formulario formulario = new Formulario();
         formulario = formulario.Template(template);
         return View("Create",formulario);
    }
    
    [HttpPost]
    public ActionResult Create(Formulario formulario)
    {
         return View(formulario);
    }


    Lo anterior me direcciona a "~/Views/Formularios/Create?template=plantilla", por lo que si vuelvo a cargar la página con javascrip con el método location.reload() vuelve a cargar la dirección completa y por ende, me vuelve a generar un formulario con la plantilla indicada.

    Ahora, si utilizó los mismos controladores anteriores, pero renombrando el primero, este me carga la dirección en la barra con el nombre del controlador, no dirigiendo la página a "Create", por lo que no utilizo el segundo controlador y no me permite la posibilidad de recargar la página con el modelo actualizado.

    Para actualizar el modelo, por ejemplo, al eliminar una pregunta, llamo a un método por medio de javascript:

    <script>
         function deleteQuestion(elemento){
              var formulario (@Html.Raw(JsonConvert.SerializeObject(@Model)));
              var idPregunta = $(elemento).data("value")
    
              $.ajax({
                   url: @Url.Action("DeleteQuestion", "Formulario"),
                   type: "POST",
                   data: {idPregunta, formulario},
              })
         }
    </script>
    

    y el método que se llama por medio del script es el siguiente:

    [HttpPost]
    public ActionResult DeleteQuestion(int idPregunta, Formulario formulario){
         List<Preguntas> preguntas = new List<Preguntas>;
         
         foreach(Preguntas p in formulario.Preguntas)
         {
              if(p.idPregunta == idPregunta)
              {
                   preguntas.Add(p);
              }
         }
         
         formulario.Preguntas = preguntas;
    
         return View("Create", formulario);
    }

    Este método lo utilizo para actualizar las vistas parciales, sin embargo, aunque se cargue una vista parcial con la información, este no actualiza el modelo, por lo que, al eliminar otra pregunta, este modelo me carga la información completa del formulario eliminando las actualizaciones previas.

    Si alguien sabe como puedo actualizar el modelo de la vista les agradecería me pudiesen dar una luz sobre este tema.

    Saludos cordiales,

    Kresnik

    martes, 12 de mayo de 2020 18:09

Respuestas

  • hola

    >>si vuelvo a cargar la página con javascrip con el método location.reload() vuelve a cargar la dirección completa y por ende, me vuelve a generar un formulario con la plantilla indicada

    eso es correcto, usaste el reload() de javascript

    >>si utilizó los mismos controladores anteriores, pero renombrando el primero, este me carga la dirección en la barra con el nombre del controlador, no dirigiendo la página a "Create",

    no entendi

    El primer Create esta asociado al verbo http GET, el segundo solo aplica si realizas un submit de un <form> por eso se realiza el POST

    Si cambias los nombres esa asociacion entre los verbos http se puede ver afectada

    >>al eliminar una pregunta, llamo a un método por medio de javascript

    porque no defines un action con el [HttpDelete] asi en lugar de hacer un post usas el verbo http delete

    >>aunque se cargue una vista parcial con la información, este no actualiza el modelo

    recuerda que el GET por defecto cachea los datos html, no uses el reload() si quieres ver datos actualizados, navega nuevamente a la url para forzar la recarga

    >>por lo que, al eliminar otra pregunta, este modelo me carga la información completa del formulario eliminando las actualizaciones previas

    una desarrollo web no mentiene estado

    Si defines una variable solo vive lo que el request dure, si estas armando una lista de preguntas y defines solo variables se perderan ni bien se retorne un resultado al browser

    Tienes que usar el objeto Session para conservar los datos

    Formas de almacenar datos temporales en Asp.net MVC (ViewData, ViewBag, TempData y Session)

    con el Session tendras los datos entre las diferentes llamadas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta kresnik lunes, 18 de mayo de 2020 15:27
    miércoles, 13 de mayo de 2020 5:54

Todas las respuestas

  • hola

    >>si vuelvo a cargar la página con javascrip con el método location.reload() vuelve a cargar la dirección completa y por ende, me vuelve a generar un formulario con la plantilla indicada

    eso es correcto, usaste el reload() de javascript

    >>si utilizó los mismos controladores anteriores, pero renombrando el primero, este me carga la dirección en la barra con el nombre del controlador, no dirigiendo la página a "Create",

    no entendi

    El primer Create esta asociado al verbo http GET, el segundo solo aplica si realizas un submit de un <form> por eso se realiza el POST

    Si cambias los nombres esa asociacion entre los verbos http se puede ver afectada

    >>al eliminar una pregunta, llamo a un método por medio de javascript

    porque no defines un action con el [HttpDelete] asi en lugar de hacer un post usas el verbo http delete

    >>aunque se cargue una vista parcial con la información, este no actualiza el modelo

    recuerda que el GET por defecto cachea los datos html, no uses el reload() si quieres ver datos actualizados, navega nuevamente a la url para forzar la recarga

    >>por lo que, al eliminar otra pregunta, este modelo me carga la información completa del formulario eliminando las actualizaciones previas

    una desarrollo web no mentiene estado

    Si defines una variable solo vive lo que el request dure, si estas armando una lista de preguntas y defines solo variables se perderan ni bien se retorne un resultado al browser

    Tienes que usar el objeto Session para conservar los datos

    Formas de almacenar datos temporales en Asp.net MVC (ViewData, ViewBag, TempData y Session)

    con el Session tendras los datos entre las diferentes llamadas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta kresnik lunes, 18 de mayo de 2020 15:27
    miércoles, 13 de mayo de 2020 5:54
  • Saludos Leandro,

    Muchas gracias por tomarte el tiempo de responderme (y entender mis jeroglíficos jeje)

    Lamento responder tanto tiempo después pero no me aparecía tu respuesta.

    En cuanto a la solución, ya había probado el uso de ViewData y ViewBag, pero no me persistían, voy a probar con el TempData y Session para ver como me va.

    En cuanto al verbo HTTPDelete, no encontré mucha información al respecto de su funcionamiento, por lo que tengo que investigar más para implementarlo de manera correcta.

    De nuevo te agradezco la ayuda!!

    Saludos cordiales,

    Kresnik

    lunes, 18 de mayo de 2020 15:31