Chalalo Land

Tecnologías ASP.NET y un poco Más

Contacto


 Si quierer cooperar, yo feliz, muy agradecido :)

De donde me Visitan?

Locations of visitors to this page

Generic Content

Si te gustaron los articulos, y te animas te estaría muy agradecido!


Recent Posts

Tags

Community

Blogs de MVP

Amigos Geeks

Blogs Imperdibles

GODS

Archives

Email Notifications

[Tutorial] Insertando Datos con jQuery + WCF y Bonus Track , HTA

Hola!, había dejado los tutoriales, por un tema de tiempo, de hecho , ahora tampoco tengo, pero el blog tiene gran importancia para mi, así que nos vamos con este tutorial paso a paso, Inspirado por el trabajo de mi Mega Maestro Stephen Walther.Hoy nos convoca  el crear una pequeña aplicación que maneje datos mediante jQuery y WCF, el esquema es simple y es el siguiente.

image

Vamos a tener un formulario HTML y guardado con HTA, de manera de que parezca una aplicación out the browser.Nuestra aplicación consistirá en una pequeña agenda telefónica (sin mucho diseño), pero que permita insertar, modificar, buscar y eliminar registros.Para que no sea tan largo el tutorial, vamos ir avanzando de a poco, en esta entrega, la inserción de datos.

Paso 1. Crear la Base de datos

Para esto voy a utilizar Sql Server 2008 y mediante el Management Studio vamos a crear nuestra BD.

image

 

Es algo sencillo, no creo que sea de una utilidad real, pero nos sirve para el tutorial.

 Paso 2.- Crear la aplicación Web

image

Vamos a seleccionar ASP.NET Empty Web Aplication, que como saben, es una aplicación web limpia, sin los templates que nos ofrece Visual Studio 2010.Según nuestro diseño (Figura 1) , tenemos que crear el Modelo de Entidades, para ello vamos a utilizar ADO.NET Entity Framewok. Para esto:

  1. Seleccionamos la opción Agregar nuevo Item del proyecto, seleccionamos ADO.NET Entity Data Model.
    image
  2. Luego le damos un nombre, en mi caso MiAgendaBD, luego seleccionamos “Generar desde una Base de Datos” y seleccionamos nuestra conexión.
    image
  3. Luego podemos elejir las tablas que van a formar parte del modelo, que en nuestro caso es solo una, finalmente vamos a ver nuestro Modelo Generado:
     image

Ya tenemos nuestro modelo, ahora nos queda crear los servicios WCF para (por lo menos en esta entrega del tutorial), insertar los datos.

Seleccionamos la opción agregar nuevo Item y seleccionamos Ajax - Enabled WCF Service. Ahora veamos el código del servicio.

Imports System.ServiceModel
Imports System.ServiceModel.Activation
Imports System.ServiceModel.Web

<ServiceBehavior(IncludeExceptionDetailInFaults:=True)>
<ServiceContract([Namespace]:="")>
<AspNetCompatibilityRequirements (RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>

 Public Class InsertarContacto
    Private _contexto As New MiAgendaEntities
    <OperationContract()> 
    Public Function insertarContacto(
                 
       ByVal Nombre As String, ByVal Apellido As String,
                         ByVal Movil As String, ByVal Email As String,
                         ByVal Observacion As String) As Boolean
        Try
            Dim contacto As New Contactos With {.Nombre = Nombre,
                                            .Apellido = Apellido,
                                            .Movil = Movil,
                                            .Email = Email,
                                            .Observacion = Observacion}
            _contexto.AddToContactos(contacto)
            _contexto.SaveChanges()
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function
End Class

Tal como lo explica Sthepen, la directiva :

<ServiceBehavior(IncludeExceptionDetailInFaults:=True)>

Esta directiva nos va a servir mientras estemos desarrollando el proyecto, de manera de recibir información detallada de los errores que se sucedan, sin embargo en explotación, s hace necesario removerla.

Paso 3a. Crear la llamada desde JQuery y el Formulario Web

Una exigencia para llamar a un servicio web WCF desde JQuery es que debe ser bajo la notación JSON. El request debe incluir el content-type:application/json y todos los parámetros incluidos n el request deben ir encodeados por JSON. El problema es que jQuery no incluye un método para serializar JSON, aunque existe para deserializar (un poco raro no?), por lo que vamos a utilizar una librería externa que nos provea esta funcionalidad.

La librería que usaremos la puedes descargar desde:
http://www.json.org/js.html

El formulario, tiene como verás un diseño de otro mundo (del mundo de los feos!), pero nos va a servir para el propósito, además no voy a agregar validaciones, en otro post en el futuro si lo haré.

image 
Agregamos las referencias Javascript a jQuery y json2:

<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.js" type="text/javascript"></script> 
<script src="Scripts/json2.js" type="text/javascript"></script> 

Como ves estamos utilizando Microsoft AJAX CDN (puedes ver mi articulo sobre el tema aquí),

El script jQuery asociado es:
<script type="text/javascript">
    $("#BotonAgregar").click(function () {
        //Convertir los datos del formulario en un objeto
        var objeto = { Nombre: $("#Nombre").val(), Apellido: $("#Apellido").val(), Movil: $("#Movil").val(), Email: $("#Email").val(), Observaciones:$("#Observaciones").val()};

        //JSONeasamos la data (objeto) buen verbo!
data = JSON.stringify(objeto); 

  $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "AgendaService.svc/insertarContacto",
 
           data: data,
            dataType: "json",
            success: insertarCallback
        });
    });

function insertarCallback(result) {
        result = result["d"];
        if (result === true) {
            alert("Contacto Agregado");
        } else {
            alert("Error al tratar de Grabar el contacto");
        }
    }
</script>

Analizando el código podemos ver que atachamos una función al evento click del botón mediante el selector convertimos los datos el formulario en un objeto, luego ese objeto le aplicamos el método stringify para convertir l objeto a notación JSON.Luego viene la estructura del post, en donde hacemos referencia al type, contenType, url , data, tipo de la data (JSON) y la función Callback , que es la función que se llama al haber concluido la petición.Por razones de seguridad WCF siempre retorna los request con  una variable d encapsulada(wrapper)e se necesita desencapsular, eso lo hacemos con (result = result["d"];).
Y al Momento de probarlo…

image

Paso 3b. Crear la aplicación HTA

Por si no lo sabias, las Hypertext Application (HTA) es una plataforma construida sobre Internet Explorer para desarrollar aplicaciones de Escritorio. Las capacidades son similares a estar ocupando el browser, pero con toda la interfaz de una app de escritorio.Para crear una aplicación hta, vamos a copiar nuestro html en el escritorio y a renombrar el archivo htm a hta. Luego vamos a agregar a nivel de código el tag hta:application.

image

Luego vamos agregar el tag hta en el header

  <hta:application id="oHTA" applicationname="Mi Aplicacion de Contactos" border="thin" borderstyle="normal" caption="yes" icon="" maximizebutton="no" minimizebutton="no"showintaskbar="no" singleinstance="no" sysmenu="yes" version="1.0" windowstate="normal" />

También vamos a modificar la url del servicio que estamos llamando completando la uri

$.ajax({   type: "POST",
   contentType: "application/json; charset=utf-8",
   url: http://localhost:51948/AgendaService.svc/insertarContacto,
   data: data,
   dataType: "json",
  
success: insertarCallback
});

Si quieres saber más sobre las aplicaciones HTA, te recomiendo los siguientes links:
http://www.c-point.com/javascript_tutorial/HTML_Applications.htm
http://msdn.microsoft.com/en-us/library/ms536496(VS.85).aspx

Y luego hacemos doble Click en nuestra “Aplicación” y la hacemos correr

image

Se ve bien :), tenemos una mini aplicación web en el escritorio, conectada a servicios!  si quieres el código puedes descargarlo todo (HTA + App)  desde aquí.

Espero que te sirva,
Gonzalo

Posted: 24/4/2010 7:03 por Gonzalo Perez | con 5 comment(s)
Comparte este post:

Comentarios

Carlos Maximo ha opinado:

Muy bueno, gracias!!

# April 27, 2010 1:34 AM

johnny4young ha opinado:

muy buen artículo, felicitaciones, una opinión:

la linea: _contexto.AddToContactos(contacto)

marca como "deprecated" o método obsoleto, recomendaría

_contexto.Contactos.AddObject(contacto)

saludos

# April 28, 2010 8:47 PM

Gonzalo Perez ha opinado:

Muchas gracias John!, gracias por la aclaración. Muy bueno tu blog!

# April 29, 2010 1:27 AM

Miguel ha opinado:

Muy bueno tu blog

Estoy intentando hacer tu aplicación multicapa

pero no se donde ubicar el item Ajax - Enabled WCF Service.

he pensado crear un proyecto de tipo WCF Service application

y ahi añadir el item Ajax - Enabled WCF Service que será el que acceda a la capa lógica

Las dudas que me surgen son dos:

En el proyecto de tipo WCF ¿como tengo que configurar el web.config  para que sea descubierto por la aplicación web? (si supieras

de alguna dirección donde se explica como hacerlo sería lo ideal, ya que este no era el tema del post )

¿Desde la aplicación web utilizando jQuery como tengo que invocar a los métodos del servicio?

# July 13, 2010 10:52 AM

Gonzalo Perez ha opinado:

Hola Miguel,

Descarga la Aplicación desde acá:

cid-053a660afa3473b3.skydrive.live.com/.../MisContactosSS.rar

Ahí está completa para que la puedas revisar.-

# July 14, 2010 2:57 PM