none
Recibir y Guardar direrentes modelos enviados por post RRS feed

  • Pregunta

  • Hola a todos,

    Estoy haciedo pruebas con MVC y EF pero tengo una duda de aplicación del patrón mvc,

    resulta que estoy haciendo un formulario de encuestas y usando los modelos

    Encuesta y Preguntas en mi vista solicito el nombre de la encuesta y las preguntas

    en la misma vista, mi duda es como recibo y/o almaceno estos datos en mi controlador

    es decir en mis pruebas siempre mis metodos de controlador reciben un modelo que se

    pasa por post, pero en este caso estaría enviando un modelo Encuesta y una collection

    de preguntas.

    Espero haberme explicado, toda ayuda sugerencia, consejo o link de referencia me sería de gran

    utilidad.

    De antemano agradezco su tiempo, sds

    domingo, 27 de julio de 2014 3:30

Respuestas

  • A ver, maticemos la pregunta: por POST nunca se envía un modelo, lo que se envían son los campos que hay dentro del <form>. Lo que ocurre es que si el post va a parar a un método de acción que tiene como parámetro una variable de una clase (que puede ser cualquier clase, pero habitualmente se usa la misma que definiste como "modelo"), pues entonces el "default binder" busca entre los campos que le llegaron desde la pantalla aquellos que tengan el mismo nombre que las propiedades de la clase, y rellena esas propiedades con los valores de los campos.

    Puedes definir una clase con las propiedades que quieras, de forma que coincida con los campos que te llegan desde el formulario, y así recibir esos campos poniendo la clase como argumento del método de acción. No es necesario que la clase se defina en la carpeta "Models".

    ¿Qué pasa si en tu vista has puesto múltiples campos, posiblemente generados dinámicamente, y por tanto no puedes tener predefinida una clase cuyas propiedades concuerden con ellos? En este caso hay varias soluciones. Una de ellas es poner como argumento del método de acción un parámetro del tipo FormCollection. Esta clase contiene una serie de parejas nombre/valor que te proporcionan todos los valores recibidos en el POST. Los puedes procesar uno por uno con un bucle, o llamándolos por su nombre. Otra alternativa es llamar dentro del método a Request.Form["nombre"] para ir sacando por su nombre cada uno de los datos recibidos en el POST.

    • Marcado como respuesta racanix lunes, 28 de julio de 2014 15:35
    domingo, 27 de julio de 2014 7:24
  • pero en este caso estaría enviando un modelo Encuesta y una collection de preguntas.

    pero en el view como representa esta encuesta y sus preguntas ?

    si el modelo es algo como esto

    public class EncuantaModel{
    
       public class List<PregunaModel> Preguntas {get;set;}
    
    }
    
    public class PreguntaModel{
    
       public string Respuesta {get; set;}
    
    }



    podrias en la view usar algo como ser

    @for(int i=0; i<Model.Preguntas.Count, i++){
    
       @Html.TextBoxFor(x=> x.Preguntas[i].Respuesta)
    
    }

    si haces algo como esto luego en el post deberias recibir lo que el usuario escriba en el una coleccion de preguntas respetando la estructura de las clases

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta racanix lunes, 28 de julio de 2014 15:34
    domingo, 27 de julio de 2014 11:24

Todas las respuestas

  • A ver, maticemos la pregunta: por POST nunca se envía un modelo, lo que se envían son los campos que hay dentro del <form>. Lo que ocurre es que si el post va a parar a un método de acción que tiene como parámetro una variable de una clase (que puede ser cualquier clase, pero habitualmente se usa la misma que definiste como "modelo"), pues entonces el "default binder" busca entre los campos que le llegaron desde la pantalla aquellos que tengan el mismo nombre que las propiedades de la clase, y rellena esas propiedades con los valores de los campos.

    Puedes definir una clase con las propiedades que quieras, de forma que coincida con los campos que te llegan desde el formulario, y así recibir esos campos poniendo la clase como argumento del método de acción. No es necesario que la clase se defina en la carpeta "Models".

    ¿Qué pasa si en tu vista has puesto múltiples campos, posiblemente generados dinámicamente, y por tanto no puedes tener predefinida una clase cuyas propiedades concuerden con ellos? En este caso hay varias soluciones. Una de ellas es poner como argumento del método de acción un parámetro del tipo FormCollection. Esta clase contiene una serie de parejas nombre/valor que te proporcionan todos los valores recibidos en el POST. Los puedes procesar uno por uno con un bucle, o llamándolos por su nombre. Otra alternativa es llamar dentro del método a Request.Form["nombre"] para ir sacando por su nombre cada uno de los datos recibidos en el POST.

    • Marcado como respuesta racanix lunes, 28 de julio de 2014 15:35
    domingo, 27 de julio de 2014 7:24
  • pero en este caso estaría enviando un modelo Encuesta y una collection de preguntas.

    pero en el view como representa esta encuesta y sus preguntas ?

    si el modelo es algo como esto

    public class EncuantaModel{
    
       public class List<PregunaModel> Preguntas {get;set;}
    
    }
    
    public class PreguntaModel{
    
       public string Respuesta {get; set;}
    
    }



    podrias en la view usar algo como ser

    @for(int i=0; i<Model.Preguntas.Count, i++){
    
       @Html.TextBoxFor(x=> x.Preguntas[i].Respuesta)
    
    }

    si haces algo como esto luego en el post deberias recibir lo que el usuario escriba en el una coleccion de preguntas respetando la estructura de las clases

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta racanix lunes, 28 de julio de 2014 15:34
    domingo, 27 de julio de 2014 11:24
  • Gracias Alberto y Leandro

    Esto ya me aclaro un poco más lo que pensaba hacer

    Sds y gracias por su ayuda

    lunes, 28 de julio de 2014 15:34