sábado, 5 de mayo de 2012

Envíar un JSON bien formado asincrónicamente al servidor sin morir en el intento (ASP.NET MVC + AJAX + JSON)

Bueno, desde que trabajo con ASP.NET MVC se me ha hecho más que recurrente postear un JSON en el servidor de manera asincrónica utilizando la función $.ajax de jQuery. El problema surge cuando se necesita realizar el binding de tu JSON con un objecto complejo creado en C# que puede tener muchos niveles de profundidad.

He visto en internet muchos artículos en donde cada vez que se necesita crear un objeto json lo hacen de esta manera:
var persona = {
nombre: 'Max',
edad: '24'
};
Lo cual es muy útil cuando tienes un objeto sencillo, pero ¿Qué pasa si necesitamos crear un JSON dinámicamente y a demás complejo de muchos niveles? las probabilidades de que el JSON quede mal formado son muy grandes y lo que tambien es muy probable es que pases mucho rato tratando de solucionar este problema. ¿La solución? ... Objetos y Clases en JavaScript :-) Para estos casos es muy conveniente utilizar clases y objetos en javascript, bueno comencemos con un ejemplo: Crearemos entonces algunas clases:
//Definimos nuestras clases.
function Persona(){
   this.Nombre = "";
   this.Apellido = "";  
   this.Edad = ""
   this.Mascotas = new Array();
}

function Mascota(){
   this.Nombre = "";
   this.Tipo = "";
   this.Edad = "";
}

//Creamos una persona 
var persona = new Persona();

persona.Nombre = "Max";
persona.Apellido = "Becerra";
persona.Edad = "24";

//Creamos nuestra primera Mascota
var perrito = new Mascota();

perrito.Nombre = "Pillín";
perrito.Tipo = "Perro";
perrito.Edad = "6";

//Creamos nuestra segunda Mascota

var gatito = new Mascota();

gatito.Nombre = "Tommy";
gatito.Tipo = "Gato";
gatito.Edad = "2";

//Ahora procederemos a asignarle las mascotas a nuestra persona

persona.Mascotas.push(perrito);
persona.Mascotas.push(gatito);

//Bueno el objeto que hemos creado no es tan complejo pero  
//al crearse dinámicamente puede adquirir muchos más niveles
//de los que les hemos dado acá.


A estas alturas debes estar preguntandote ¿Y el JSON?, bueno es aquí donde viene lo mejor, utilizaremos la función JSON.stringify de Javascript que permite pasarle cómo parametro un objeto JavaScript y serializarlo :
var json = JSON.stringify(persona);
Entonces nuestra variable json almacena un JSON pfectamente serializado y de esta manera nos evitamos tener errores de formato. Ahora lo que nos falta es enviarlo al servidor asincrónicamente utilizando AJAX:
$.ajax({
                type: "POST",
                url: url,
                data: json,
                contentType: 'application/json; charset=utf-8',
                success: function (datos) {
                    if (datos) {
                        alert("Funciona :-)");
                    }
                    else {
                        alert("No funciona :-(");
                    }
                }
            });
Es muy importante no olvidar agregar explicitamente el attributo: contentType: 'application/json; charset=utf-8' en la función AJAX ya que si no lo haces estarás enviando un JSON al servidor pero este jamás sabrá que lo que envías es un JSON y esto es esencial para que el controller de ASP.NET MVC pueda realizar el binding adecuado entre el JSON y tu objeto complejo. Hasta la próxima y Happy Coding! :-)

domingo, 8 de abril de 2012

Bienvenida

Hola a todos, bueno mi nombre es Maximiliano, soy Ingeniero en Computación e Informática, tengo 24 años y en este blog pretendo compartir con ustedes todas mis experiencias laborales relacionadas con la Ingeniería de Software en general por lo que estaré actualizando constantemente este espacio con el que pretendo compartir mi crecimiento profesional dentro del increíble mundo de los 0's y 1's . Nos vemos luego :-)