none
metodo JsonResult RRS feed

  • Pregunta

  • buenas.. mi duda es con la llamada de un metodo JsonResult la cual la ago desde javascript pero el problema es que el dato que le mando me lo coloca como null

    mi metodo esta asi

    public JsonResult metodo(string dato){

    Dictionary<string, object> map = new Dictionary<string, object>();
    map.Add("result", dato);
    map.Add("success", true);
    return Json(map, JsonRequestBehavior.AllowGet);

    }

    dentro de una funcion javascript realizo la llamada al metodo

    $.ajax({
                       url: "home/metodo",
                       type: "POST",
                       data: JSON.stringify({ dato: "2" }),
                       dataType: 'json',
                       contentType: "application/json",
                       success: function (data) {
                           if (data.success) {
                               alert(data.result);
                           }
                       }
                   });

    como se puede ver el parametro se lo estoy mandando fijo para que no exista problema pero al momento de lanzar la alerta me muetra que el valor es null, pero yo le estoy mandando el valor del parametro de mi metodo.

    porque ocurre este comportamiento?...


    jose


    • Editado ch-B miércoles, 6 de junio de 2012 2:49 correccion
    miércoles, 6 de junio de 2012 2:45

Respuestas

  • Buenas!

    No te va porque has modificado el nmbre de los parámetros!

    Antes hacías:

    data: JSON.stringify({ dato: "2" }),

    Y ahora haces:

    data: JSON.stringify({ parametro: obj }),

    El model binder de ASP.NET MVC espera que la clase en C# tenga el mismo "aspecto" que el objeto json. Si tu envias un json que es {dato:"2"}, el model binder espera que haya una clase con una propiedad dato de tipo string (era mi clase DatoJson o tu clase Dato).  Deja el código de la parte javascript como lo tenias antes y te debería funcionar. ;-)

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Eder Costa lunes, 29 de octubre de 2012 12:02
    jueves, 7 de junio de 2012 5:59

Todas las respuestas

  • Buenas!

    Primero, eso que quieres hacer requiere de ASP.NET MVC3, ya que estás enviando datos en formato json al servidor y eso no está soportado por MVC2 (debes crearte un value provider propio si quieres soportarlo).

    Bien, en MVC3 el código así tampoco te funcionará, porque si pones un breakpoint en el controlador verás que el parámetro "dato" es null. Y eso es porque tu estás enviando esto al controlador:

    {dato:"2"}

    Eso NO es una cadena, eso es un objeto con una propiedad (dato) de tipo cadena. Así que eso es lo que debe recibir el controlador:

    public class DatoJson
    {
       public string dato { get; set;}
    }

    Y el controlador debe recibir un objeto DatoJson, no un string:

    public ActionResult metodo(DatoJson data){
    var map = new Dictionary<string, object>();
    map.Add("result", data.dato);
    map.Add("success", true);
    return Json(map, JsonRequestBehavior.AllowGet);
    }

    Esto, sí te debería funcionar (repito, en MVC3).

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    miércoles, 6 de junio de 2012 7:19
  • ok.. entonses mira me arme este escenario pero sigo cometiendo erroes

    me ise una clase que contiene lo siguiente que se llama datojson

     private string dato;

            public string Dato
            {
                get { return dato; }
                set { dato = value; }
            }

    el metodo JsonResult quedo de la sifuiente forma

    public JsonResult metodo(datojson parametro)
            {
                Dictionary<string, object> map = new Dictionary<string, object>();
                map.Add("result", parametro.Dato);
                map.Add("success", true);
                return Json(map, JsonRequestBehavior.AllowGet);
            }

    entonses en la llamada al metodo la deje de la siguiente forma

       var obj = { Dato: "2" };
                   $.ajax({
                       url: "home/metodo",
                       type: "POST",
                       data: JSON.stringify({ parametro: obj }),
                       dataType: 'json',
                       contentType: "application/json",
                       success: function (data) {
                           var resultado = data.result;
                           if (data.success) {
                               alert(resultado.Dato);
                           }
                       }
                   });

    pero te comento me sigue saliendo nulo on entiendo en donde estoy cometiendo el error :S


    jose arreola

    jueves, 7 de junio de 2012 4:06
  • Buenas!

    No te va porque has modificado el nmbre de los parámetros!

    Antes hacías:

    data: JSON.stringify({ dato: "2" }),

    Y ahora haces:

    data: JSON.stringify({ parametro: obj }),

    El model binder de ASP.NET MVC espera que la clase en C# tenga el mismo "aspecto" que el objeto json. Si tu envias un json que es {dato:"2"}, el model binder espera que haya una clase con una propiedad dato de tipo string (era mi clase DatoJson o tu clase Dato).  Deja el código de la parte javascript como lo tenias antes y te debería funcionar. ;-)

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Eder Costa lunes, 29 de octubre de 2012 12:02
    jueves, 7 de junio de 2012 5:59
  • Si precisas enviar datos en mvc2, dado lo visto, puedes mandar un string a secas, o un array de strings, sin problemas

    Eustaquio Martin

    martes, 26 de junio de 2012 14:53