none
pasar un objeto desde la vista al controlador [error] RRS feed

  • Pregunta

  • Saludos a todos

    Estoy desarrollando una aplicación con ASP.Net MVC 4 y tengo el siguiente problema:

    quiero pasar un objeto desde la vista al controlador, lo hago de la siguiente manera:

    var persona = {};
                function ModeloPersona() {
                    persona.CI = $('#CI').val();
                    persona.Nombre = $('#Nombre').val();
                    persona.Apellidop = $('#Apellidop').val();
                    persona.Apellidom = $('#Apellidom').val();
                    persona.Direccion = $('#Direccion').val();
                    persona.Sexo = $('#Sexo').val();
                    persona.Cumple = $('#Cumple').val();
                }
    
                function Grabar(modo) {
                    ModeloPersona();
                    $.ajax({
                        url: '@Url.Action("Grabar", "Home")',
                        type: 'POST',
                        data: { Persona: JSON.stringify(persona) },
                        contentType: 'application/json; charset=utf-8',
                        dataType: 'json',
                        success: function () {
                            
                        }
                    });
                }


    en el controlador recibo el objeto persona todos los atributos nulos, pero si cambio el data por esto:

    data : JSON.stringify(persona),

    funciona correctamente recibo los atributos del objeto con los datos correspondientes.

    Necesito utilizar esa forma porque debo pasar dos parametros al controlador un objeto y un texto de la siguiente manera:

    function Grabar(modo) { ModeloPersona(); $.ajax({ url: '@Url.Action("Grabar", "Home")', type: 'POST', data: { Persona: JSON.stringify(persona), Modo: modo

    }, contentType: 'application/json; charset=utf-8', dataType: 'json', success: function () { } }); }


    y en el controlador:

    public ActionResult Grabar(Persona mPersona, string modo){
      if (ModelState.IsValid){
        if (modo == "2"){
    
        }
        else{
    
        }
      }
      return View();
    }

    el problema es el mismo en el controlador el objeto mPersona los datos estan nulos pero el valor de modo es correcto, alguien se encontró con este problema y lo pudo solucionar?

    si tienen algún tip o información para coloborar les estaré agradecido

    saludos

    Ricardo

    lunes, 19 de noviembre de 2012 4:33

Respuestas

  • Gracias WebJose/Leandro siempre por su predisposición a colaborar.

    Encontré la solución al problema.

    El nombre de los parametros del método Action (Controlador) tienen que coincidir con los nombres de los objetos en los datos JSON (Vista) para poder hacer el binding.

    public ActionResult Grabar(Persona mPersona, string modo){

    Lo único que hice fúe cambiar mPersona por persona que paso en la vista.

    data: { 
           Persona: JSON.stringify(persona),
           Modo: modo 
     },

    de esta forma ya en controlador tengo los datos del objeto persona.

    Saludos

    Ricardo

    • Marcado como respuesta ricardo_jal lunes, 19 de noviembre de 2012 13:59
    lunes, 19 de noviembre de 2012 13:59

Todas las respuestas

  • Haga del modo una propiedad de Persona.  Luego podrá usar la forma data : JSON.stringify(persona) que incluirá el modo.  ASP.net MVC correctamente recreará el objeto .Net y el parámetro modo.  Nunca lo he hecho así, pero apostaría a que funciona bien.

    Jose R. MCP
    Code Samples

    lunes, 19 de noviembre de 2012 6:49
  • porque no usas

    var params = new Object();

    params.mPersona = persona;

    params.modo = 'modo';

    y usas

     $.ajax({
         url: '@Url.Action("Grabar", "Home")',
         type: 'POST',
         data: JSON.stringify(params),
        },

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 19 de noviembre de 2012 13:22
  • Gracias WebJose/Leandro siempre por su predisposición a colaborar.

    Encontré la solución al problema.

    El nombre de los parametros del método Action (Controlador) tienen que coincidir con los nombres de los objetos en los datos JSON (Vista) para poder hacer el binding.

    public ActionResult Grabar(Persona mPersona, string modo){

    Lo único que hice fúe cambiar mPersona por persona que paso en la vista.

    data: { 
           Persona: JSON.stringify(persona),
           Modo: modo 
     },

    de esta forma ya en controlador tengo los datos del objeto persona.

    Saludos

    Ricardo

    • Marcado como respuesta ricardo_jal lunes, 19 de noviembre de 2012 13:59
    lunes, 19 de noviembre de 2012 13:59