Comenzando con ASP.NET Web API y Odata , Parte 3

Hola que tal?, seguimos con esta serie de artículos sobre Web Api y Odata, esta vez veremos las opciones de consulta.

Una de las potencialidades de Odata es la capacidad de definir consultas personalizadas y parametrizadas mediante la url, siguiendo nuestros ejemplos anteriores, podemos tener:

http://localhost:1927/Odata/Asignaturas?$orderby=Semestre

A estos parámetros Odata les llamara “query Options”, dentro de las que nos ofrece Odata tenemos:

  • $filter: Filtra los resultados, basados en una condición booleana.
  • $inlinecount: Le indica al servidor que incluya dentro del resultado el total de entidades que se obtuvieron por medio de la query, eso está pensado en la páginación eficiente del lado del servidor
  • $orderby: Ordena los resultado por algún criterio establecido en la query.
  • $skip: omite los primeros n resultados, apropiado para la paginación.
  • $top: Retorna solo los primeros n resultados.

Antes que nada, debemos habilitar la posibilidad de utilizar estas Query Options, y se debe hacer explícitamente, así que nos vamos al método Register del archivo WebApiConfig y des comentamos la línea que dice : config.EnableQuerySopport();

image

Si no te aparece esto, es por que debes instalar el WebTools 2012.2 Update, ya que la plantilla  Web API incluye este código.

Algo importante de indicar,  es que el método  EnableQuerySupport habilita las consultas para todos las acciones de los controladores que retornen un tipo IQueryable. Si no quieres que esto suceda, y solo agregar esta característica a algunas acciones, debes agregar el atributo [Queryable] a cada acción:

[Queryable]

public override IQueryable<Asignatura> Get()

{

   return asignaturas.AsQueryable();

}

Veamos entonces algunos ejemplos de consultas, si recordamos el artículo anterior teníamos:

http://localhost:1927/Odata/Asignaturas/

image

Para los filtros tenemos:

Retorna todos las asignaturas con semestre igual a 2:

http://localhost:1927/Odata/Asignaturas?$filter=Semestre eq 2

image

Retorna todas las asignaturas que tienen el string II dentro de Nombre:

http://localhost:1927/Odata/Asignaturas?$filter=substringof(‘II’,Nombre)

image

La misma consulta anterior, pero con el retorno de la cantidad de resultados:

http://localhost:1927/Odata/Asignaturas?$filter=substringof(‘II’,Nombre)&$inlinecount=allpages

image

El mismo ejemplo anterior, le agregamos ordenación descendente por ID

http://localhost:1927/Odata/Asignaturas?$filter=substringof(‘II’,Nombre)&$inlinecount=allpages&$orderby=ID desc

image

Como vez, bastante útil y fácil, en el próximo articulo revisaremos el tema de la paginación con un completo ejemplo, nos vemos!

@chalalo.

[Tips] Exportar String a PDF en ASP.NET con iTextSharp

Una de las consultas recurrentes que recibo es sobre como crear pdf en ASP.NET, para esto hay varias respuestas, esta vez voy a mostrar una bastante sencilla de la mano de iTextSharp, que es una biblioteca gratis con muy buenas opciones para la generación pdf a partir de un string que almacena un HTML.

Lo primero que vamos a hacer es , mediante Nuget, obtener la biblioteca:

image

Una vez instalado, vamos a agregar (esto es opcional) una carpeta en donde estén nuestras plantillas para imprimir nuestro informe:

image

Este archivo test.html no es nada más que un archivo HTML en donde agregué el siguiente código:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title></title>

</head>

<body>

    <p>Nombre:[nombre]</p>

    <p>Apellido:[apellido]</p>

    <p>Edad:[edad]</p>

</body>

</html>

Como puedes ver es bastante simple, y tambien verás que tengo [campos] que son los que vamos a remplazar con los datos que se van a agregar desde la siguiente Pagina aspx:

image

Ahora en el botón agregamos:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

      Dim document = New Document(PageSize.A4, 50, 50, 25, 25)

      Dim output = New MemoryStream()

      Dim writer = PdfWriter.GetInstance(document, output)

      document.Open()

      Dim contents As String = File.ReadAllText(Server.MapPath("/HTMLTemplate/Test.html"))

      contents = contents.Replace("[nombre]", tx_nombre.Text)

      contents = contents.Replace("[apellido]", tx_apellido.Text)

      contents = contents.Replace("[edad]", tx_edad.Text)

 

 

      Dim parsedHtmlElements = HTMLWorker.ParseToList(New StringReader
                                                  (contents),
Nothing
)

      For Each var As IElement In parsedHtmlElements

            document.Add(TryCast(var, IElement))

      Next

   document.Close()

   Response.ContentType = "application/pdf"

   Response.AddHeader("Content-Disposition", "attachment;filename=test.pdf")

   Response.BinaryWrite(output.ToArray())

 

End Sub

Como puedes ver, estamos creando el documento con las dimensiones especificadas en el contructor, luego leemos el contenido del archivo html para finalmente reemplazar el contenido del los campos con [corchetes]. Finalmente escribimos el pdf.

image

Abrimos y listo!, PDF creado:

image

Obviamente esto es una simplificación al máximo de lo que se puede realizar , te recomiendo que visites la página del proyecto para muchas más opciones:

http://sourceforge.net/projects/itextsharp/

Saludos!.,
@chalalo

Comenzando con ASP.NET Web API y Odata , Parte 2

Hola, vamos a seguir revisando este tema de Web API junto con Odata, está vez voy a utilizar una clase para ver algunas potencialidades del sistema de consulta.

Voy a seguir utilizando el ejemplo del artículo anterior, el cual iremos completando poco  a poco.

Lo primero que vamos a hacer es agregar una nueva clase al proyecto en la carpeta models:

image

A esta clase le voy a llamar Asignatura, la cual va a tener la siguiente estructura:

  public class Asignatura

     {

        public int ID { get; set; }

        public string Nombre { get; set; }

        public int Creditos { set; get; }

        public int Semestre { set; get; }

 

    }

A continuación vamos a agregar un controlador específico para esta clase, la cual nos va a proveer del manejo de los HTTP request para esta entidad, vamos a elegir controlador de la API vacío, ya que crearemos a mano las acciones necesarias.

image

Puedes notar que al agregar el controlador, la clase deriva de APIController, debemos modificar esto a EntitySetController:

image

Ahora, puede ser que veas que no tienes el ensamblado System.Web.Http.OData , por lo que deberás incluir el ensamblado, yo lo hice mediante Nuget

image

Podemos crear el endpoint utilizando la clase ODataController directamente, sin embargo EntitySetController maneja los detalles de la creación correcta de las respuesta HTTP en conformidad con OData.  Esto nos permetirá centrarnos en el código específico de la aplicación. Lac lase EntitySetController toma dos parámetros de tipo de genérico: El primero es el tipo de la entidad (Asignatura) y el segundo es del tipo clave de la entidad, en nuestro caso , lo definimos con int. El esquema es el siguiente:

image

Ahora vamos a agregar una lista de asignaturas al controlador:

 

public class AsignaturaController : EntitySetController<Asignatura, int>

{

static List<Asignatura> asignaturas = new List<Asignatura>()

{

  new Asignatura() { ID=1, Nombre="Calculo I", Creditos=6, Semestre=1 },

  new Asignatura() { ID=2, Nombre="Algebra I", Creditos=6, Semestre=1 },

  new Asignatura() { ID=3, Nombre="Calculo II",Creditos=6, Semestre=2 },

  new Asignatura() { ID=4, Nombre="Algebra II",Creditos=6, Semestre=2 },

};

}

Luego veremos un ejemplo con acceso a bases de datos. Para soportar los request GET, que corresponden a lectura general de la colección y la lectura de un objeto en particular de la colección:

public override IQueryable<Asignatura> Get()

{

  return asignaturas.AsQueryable();

}

 

 

protected override Asignatura GetEntityByKey(int key)

{

    return asignaturas.FirstOrDefault(p => p.ID == key);

}

Ahora solo nos faltaría configurar los endpoint, para esto vamos a ir a la carpeta App_start y abrir el archivo WebApiConfig.cs, la cual tiene la configuración del la web api, vamos agregar en el método Register:

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();

modelBuilder.EntitySet<Asignatura>("Asignaturas");

 

Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();

config.Routes.MapODataRoute("ODataRoute", "odata", model);

 

Este código realiza dos cosas:

Crea un Entity Data Model para el Endpoint de Odata

Configura el EndPoint

 

 

El EDM es una modelo abstracto de datos, es usado para la creación de la metadata del documento (clase a devolver) para el servicio que creamos.

El método  EntitySet   agrega la entidad al set EDM:

modelBuilder.EntitySet<Asignatura>("Asignaturas");

El String “Asignaturas” define el nombre del entity Set, el nombre del controlador debe coincidir con el nombre del entity set.

Y ya estamos Listos!, vamos a probarlo con la URL http://localhost:1927/Odata/Asignaturas/

y tenemos:

{
  "odata.metadata":"
http://localhost:1927/odata/$metadata#Asignaturas","value":[
    {
      "ID":1,"Nombre":"Calculo I","Creditos":6,"Semestre":1
    },{
      "ID":2,"Nombre":"Algebra I","Creditos":6,"Semestre":1
    },{
      "ID":3,"Nombre":"Calculo II","Creditos":6,"Semestre":2
    },{
      "ID":4,"Nombre":"Algebra II","Creditos":6,"Semestre":2
    }
  ]
}

También podemos probar obteniendo solo un registro con la URL: http://localhost:1927/Odata/Asignaturas(2) y obtendremos:

  {
  "odata.metadata":"http://localhost:1927/odata/    $metadata#Asignaturas/@Element","ID":2,"Nombre":"Algebra I","Creditos":6,"Semestre":1
}

Como puedes ver consultamos el ID del registro que deseamos con el id entre paréntesis.

Bueno, seguiremos viendo OData con este objeto para que veamos más posibilidades de consulta, espero que te haya servido el artículo!

Saludos,
@chalalo

WebCast- Windows Phone 8, celular o herramienta?

Hola que tal?, quiero invitarlos a un evento de tipo “conversación” que vamos a dar con el copado Jorge Díaz, sobre Windows Phone 8, el titulo dice mucho del enfoque del evento, vamos a hablar de las ventajas de Windows Phone para escenarios desarrollo (mi aporte) y por su parte Jorge va a estar hablando de la visión de IT, como ven estamos abarcando los dos ámbitos  que nos interesan (si, también conversaremos sobre la experiencia de usuario).

Personalmente he desarrollado para blackberry, Android y IPhone, así que podremos establecer comparaciones y compartir experiencias. Eso será el próximo sabado 4 de  may0 a las 20:00 horas, es decir es un Saturday Night Webcast‏ Sonrisa

El Link de la conferencia es:
https://www311.livemeeting.com/cc/mvp/join?id=4GFT4W&role=attend&pw=M*Sk9MMbc

Así que agrégalo en tu agenda Sonrisa  nos vemos por allá.
Saludos,
Gonzalo

Comenzando con ASP.NET Web API y Odata

Hola, vamos a comenzar una pequeña serie de comenzar a utilizar el protocolo Odata junto a ASP.NET Web API, una combinación realmente potente. Para hacer un poco de memoria, OData es un protocolo abierto que permite tener acceso a un origen de datos, mediante una URL especialmente construida, constituye un enfoque simplificado de como acceder a orígenes de datos remotos. OData usa HTTP ,Atom y JSON, y nos permite a los desarrolladores crear apps que se comunican con variadas fuentes de datos. Lee más sobre este protocolo acá: http://www.odata.org/introduction/

Ahorra bien, ya hemos visto Web API en varias post que puedes encontrar en el siguiente enlace. http://geeks.ms/blogs/gperez/search.aspx?q=web+api

Lo bueno es que el release ASP.NET 2012.2 , agrega el soporte de OData para WebAPI, vamos a comenzar con lo más básico y para entender  OData , trabajaremos con la plantilla de Web API que nos provee Visual Studio .

Para realizar el primer ejemplo vamos crear un proyecto de WebApi, para eso elegimos aplicación web de asp.net mvc

image

image

Luego vamos a agregar algunos elementos a la colección que ya nos aparece en la acción Get del controlador que crea la plantilla por defecto (ValuesController)

// GET api/values

[Queryable]
public IEnumerable<string> Get()
{
return new string[] { «value0»,«value1»,«value2»,«value3»,value4″,«value5», «value6», «value7», «value8», «value9», «value10» };

}

Fijate que agregué también el atributo Queryable, esto permitirá que podamos hacer las consultas con OData. Si no tienes la referencia la puedes buscar en Nuget o descárgala desde acá:

http://www.nuget.org/packages/microsoft.aspnet.webapi.odata

Ahora ya tenemos algunos elementos más para poder jugar un poco con OData.

Vamos a realizar ejemplos básicos y revisar cual es la respuesta a nuestras peticiones.

Para llamar a la acción por defecto (estoy en mi máquina) hacemos:

 

http://localhost:1927/Api/Values y el resultado es:

image

Ahora bien ocupemos un poco más de Odata, si revisar la documentación del core veremos que existen sentencias para hacer querys (revísalas en http://www.odata.org/documentation/odata-v3-documentation/odata-core/#1023_Querying_Collections)

Vamos a ver $top y $skip,la primera nos permite obtener los primeros n elementos de la colección, asi que si hacemos:
http://localhost:1927/Api/Values?$top=2 , el resultado es:

image

Ahora bien, con $skip no “saltamos” n resultados , asi que si hacemos:
http://localhost:1927/Api/Values?$skip=2

image

Lo que nos da la pauta para realizar, por ejemplo , paginaciones:
http://localhost:1927/Api/Values?$top=3&$skip=3

image

Ahora veamos un pequeño ejemplo de como consumir esto con jquery y paginando, voy a tratar de simplificar al máximo el código

image

<!DOCTYPE html>

<html xmlns=»http://www.w3.org/1999/xhtml»>

<script src=»Scripts/jquery-1.8.2.min.js»></script>

<head>

<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″/>

    <title></title>

    <script>

        $(document).ready(function () {

            var skip = 0;

            var top = 3;

 

            $(«#atras»).click(function (e) {

                if (skip > 0) {

                      cargaDatos(skip= skip – top);

                }

            });

 

            $(«#adelante»).click(function (e) {

                    cargaDatos(skip= skip + top);

            });

 

            function cargaDatos(skip) {

                $(«ol»).empty();

                var url = «$top=» + top + «&$skip=» + skip;

                $.getJSON(‘Api/Values?’ + url, function (data) {

                    $.each(data, function (key, val) {

                        $(«ol»).append(‘<li>’ + val + ‘</li>’);

                    });

                });

            }

      

            cargaDatos(skip);

        });

    </script>

</head>

<body>

    <h1>Ejemplo con OData</h1>

    <button id=»atras»><<</button>

    <button id=»adelante»>>></button>

    <ol></ol>

 

</body>

</html>

Como puedes ver hago uso de la función getJSON de jquery para enviarlo los parámetros de skip y top, de manera de ir avanzando el skip para “paginar”. Entonces, cuando se carga por primera vez la página se carga con skip=0 y top=3 , que me posicionan en la primera página, luego cuando presionan el botón adelante o atrás se agrega o disminuye el valor del top. Dentro de la función lo primero que hago es limpiar la lista para que no se vayan agregando los valores a los ya existentes y la variable url nos permite completar la url final que se enviará a la webapi, bastante sencillo!.

Bueno, seguiré con artículos de este tipo, metiéndonos cada vez mas en esta poderosa combinación de asp.net Sonrisa

Espero que te sirva!
@chalalo

Presentación del evento Tips de ASP.NET

Hola!, esta es la presentación maratónica de tips para el desarrollo de ASP.NET, en donde vimos bastante material y ejemplos:

Puedes descargar también el video de la presentación en el siguiente Link:

http://www.sendspace.com/file/l29gzx

y hacer click en el siguiente gif (estás páginas están llenas de Adds)

image

Y bajarás 120MB de video  Sonrisa
Saludos!
G.

Soporte de Git en WebMatrix 3

Hola,como te había comentado, son varias las novedades que trae la nueva versión de webmatrix, sobre todo para el trabajo en la nube (más adelante veremos en detalle esto), pero ahora me quiero detener un poco en e soporte para GIT que viene con WebMatrix. Vamos a tener siempre la opción de TFS, en mi caso, tengo GIT instalado en mi equipo, a sí que voy a  utilizarlo, vemos en la barra de WM tenemos la opción:

image

Una vez presionado, vemos que se abren varias opciones:

image

A simple vista eché de menos el historial de comits,pero bueno , eso puede ir mejorando en el futuro.

Podemos ver los setting de Git:

image

TAmbién y como era de suponer, podemos crear las Ramas de manera muy sencilla, la estrella al lado del nombre indica el branch activo:

image

Acá también eché de menos que WebMatrix no indique con el clasico mensaje de que el archivo fue modificado por fuera de la aplicación, también es un punto mejorable, pero sin embargo, es hacer un click más, es decir, la nada misma para el beneficio.

image

Y obviamente podemos agregar repositorios remotos, de manera de poder hacer extracciones o inserciones en ellos

image

Para el ejemplo que estaba viendo, ya hice la inserción y ahora esta el archivo de prueba está en mi repositorio (de pruebas) en GitHub Sonrisa

image

El historial que te comentaba puede ser remplazado por algo un poco menos organizado, pero útil de todas maneras, que es el log, que te va a mostrar todo lo que ha sucedido con el repositorio:

image

A mi parecer, cumple su tarea, y me agrada mucho la idea que WebMatrix, que ya me parecía muy potente, ahora vaya a un nuevo nivel con todos las nuevas características, para mi es una herramienta indispensable.

Saludos!
@chalalo

Se nos viene WebMatrix 3, mucho más pro!

image

Ya esta disponible para la descarga la versión beta de WebMatrix 3, esta vez con un enfoque mucho más enfocado al desarrollo en la nube, de hecho te pide tus credenciales liveid y puedes acceder a tres meses de desarrollo gratis en la nube Sonrisa.

Hay excelentes características que entusiasman bastante de esta herramienta que es totalmente gratuita:

Podemos editar remotamente un sitio, desde Windows Azure, o un repositorio de código,lo puedes ver en la siguiente imagen:

image

Conectarnos a un repositorio Git o TFS, haciendo esta herramienta mucho más poderosa. Con Git tendremos las opciones que necesitamos desde la herramienta, revisa esto acá:

image

Junto a todas las funcionalidades que esto ya tiene, uff, tremenda herramienta para los developers.

Revisa acá mi post anterior de por que debería interesarte webmatrix:

http://geeks.ms/blogs/gperez/archive/2012/10/29/revisi-243-n-de-por-que-deber-237-a-interesarme-por-webmatrix.aspx

Descárgalo acá:

http://www.microsoft.com/web/webmatrix/next/

image

Invitación WebCast, Trucos para el desarrollo de ASP.NET y VS2012

Hola!, los quería invitar al siguiente WebCast:

Los 10 mejores trucos para el desarrollo en ASP.NET aprovechando al máximo Visual Studio 2012

image

Únete a Gonzalo Pérez (Microsoft MVP) en esta sesión online de más de 100 minutos de entrenamiento técnico en donde desclasificaremos los 10 mejores trucos, consejos y demos para desarrolladores de ASP.NET. Te enseñaremos los secretos para optimizar el desarrollo web, acelerar la implementación con Visual Studio 2012 y aprovechar las nuevas características de esta plataforma.

¡Una sesión imperdible!

Regístrate acá:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032546139&Culture=es-CL&community=1

Veremos entre otras cosas:

  • SignalR
  • Knockout.js + mvvm
  • Git + VS2012
  • Bundle Scripts
  • ASP.NET Web API
  • Test de Carga
  • Plantillas Api Facebook , Single Page Application
  • Visual Studio 2012 Page Inspector
  • Productivity Power Tools
  • Bing Maps
  • CSS Inspector
  • Modernizr
  • Typescript

Ufff! muchos temas, así que no se lo pierdan, nos vemos ahí!

Saludos,
@chalalo