Marc Rubiño

ASP.NET, C#, AJAX.NET, JavaScript, etc.
MVC Exportar Datos a .XLS “Excel Files”

Este truco es uno de los top10 en los foros de MSDN y sigue siendo una de aquellas cosas que no es fácil encontrar una documentación clara y adecuada.

Si hablamos desde la perspectiva de ASP.NET MVC esta tarea se nos simplifica muchísimo porque desde nuestro controlador podemos devolver directamente el contenido de un fichero como cualquier otro ActionResult que tengamos configurado. Para eso tenemos el método File que nos proporciona esa funcionalidad y no tenemos que utilizar directamente el objeto Response como nos pasaba con el clásico ASP.NET WebForms.

 

1 FileContentResult File(byte[] fileContents, string contentType)
2 FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName)
3 FileStreamResult File(Stream fileStream, string contentType)
4 FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName)
5 FilePathResult File(string fileName, string contentType)
6 FilePathResult File(string fileName, string contentType, string fileDownloadName)

 

Para este ejemplo utilizaré la sobrecarga que retorna un FileStreamResult porque lo que queremos hacer es:

Un servicio que recupere los datos de nuestro repositorio, serialice nuestra entidad del dominio en un XML directamente en memoria. Devuelva su contenido especificando que es un fichero Excel y el nombre del fichero que se utilizará para guardar.

Todo esto lo generará dinámicamente en memoria sin tener que tener el fichero Excel físicamente en nuestro servidor.

 

01 public ActionResult ObtenerMisEnviosXmlExcel()
02 {
03 _productosServices = new ProductosServices();
04 var stream = new MemoryStream();
05 var serialicer = new XmlSerializer(typeof(List));
06
07 //Cargo los datos
08 List datos = _productosServices.GetProductos();
09
10 //Lo transformo en un XML y lo guardo en memoria
11 serialicer.Serialize(stream, datos);
12 stream.Position = 0;
13
14 //devuelvo el XML de la memoria como un fichero .xls
15 return File(stream, "application/vnd.ms-excel", "Pedidos.xls");
16 }

 

Para poder serializar nuestra entidad del dominio utilizaremos la clase XmlSerializer que se encuentra en el namespace System.Xml.Serialization.

Cada vez que realicemos esta llamada nos devolverá el fichero Excel creado al vuelo con los datos recuperados de nuestro repositorio.

Una cosa que hay que tener en cuenta al realizar la serialización en XML, es que no es el formato estándar de Excel y tiene que abrir el fichero como datos XML. Eso implica que al abrir el fichero lance un par de avisos que son un poco incómodos más que otra cosa.

He estado probando diferentes librerías para crear ficheros Excel, pero todos te permiten montando el documento por programación, pero no montarlo automáticamente dependiendo de los datos cargados como es el caso del ejemplo anterior.

Si alguien conoce alguna librería que sea capaz de hacerlo directamente o tiene alguna experiencia parecida le invito a que la comparta para poder ampliar esta información y que nos sea de utilidad a todos.

Os recuerdo que también tenéis una entrada relacionada para generar un PDF al vuelo directamente desde una de nuestras vistas recuperando su HTML.

Cross-Posting: http://mrubino.net 

 

Posted: 25/5/2012 9:19 por Marc Rubiño | con 1 comment(s)
Archivado en: ,
Webcat May en BCN !!!

Este miércoles 23 de Mayo se celebra en Barcelona el encuentro mensual que organiza el grupo WebCat "Barcelona web professionals". En estas reuniones se realizan micro sesiones de diferentes tipos y niveles pero con el punto en común que nos une a todos los que trabajamos en entornos orientados a la web.

Micro Sesiones:

Lugar 23 mayo de 7pm a 9pm en Providència, 88, Barcelona. Para más informaciñon http://lanyrd.com/2012/webcat-may
Nos Vemos ;-)

Posted: 16/5/2012 22:17 por Marc Rubiño | con 2 comment(s)
Archivado en:
How to: Insect Invaders

 Desde que asistí al Hack-a-thon de Fuengirola sobre Windows Phone, mi intención ha sido aprovechar la cuenta de suscriptor y publicar algún tipo de aplicación.

Le estuve dando muchas vueltas a que tipo de aplicación podría realizar, mi primera intención era hacer una brújula que apuntara a la Meca para que los musulmanes lo tuvieran más fácil a la hora de orientarse, pero mi sorpresa fue mayúscula cuando me di cuenta que ya habían un par de aplicaciones de este tipo y además una era de pago. A partir de ese momento entendí que cualquier idea que pudiera tener seguro que ya estaba publicado en el MarketPlace.

Pero no desistí en el intento y se me ocurrió hacer un juego en XNA, si tengo que empezar de cero a programar para Windows Phone que mejor que hacer un juego en XNA que no una aplicación con Silverligth que no me gusta nada.

Bueno ya tenía la base y ahora pensar en el juego. Ummm mi primer juego y sin tener ni idea de XNA no puede ser muy complicada de desarrollar. Que mejor que empezar con un clásico que no tiene muchas pantallas y que seguro no puede ser muy difícil de programar como es el Space Invaders.

Cuando tomas una decisión como la mía es ir a la página de Microsoft donde puedes encontrar los ejemplos de todo lo que necesitas para desarrollar tu aplicación.

La Base para el Juego:

  • Pantallas de la aplicación
    • Inicial
    • Juego Principal
    • Menú Pausa
    • Fin de Partida
  • Un fondo que no se tiene que animar
  • Una entidad Nave para el jugador principal
    • Movimiento de derecha a izquierda
    • Disparo “sonido de disparo”
    • Explosión para cuando es alcanzado y Sonido explosión
  • Una entidad Enemigo para crear todos los enemigos con esta base.
    • Movimiento de izquierda a derecha “pero en bloque”
    • Diferentes puntuaciones por tipo de enemigo
    • Disparo
    • Explosión al ser alcanzado y sonido
  • Diferentes niveles para hacer durar un poco el juego
  • Recursos para mostrar las vidas, puntuación y record

¿ Como una persona que nunca ha creado un juego, ni a programado en XNA puede salir exitoso de esta experiencia ?

Yo por ejemplo para mi primer contacto con el tema, miré el curso de un juego con XNA llamado Shootter.

 

Existe una página web sobre desarrollo en Windows Phone indispensable para todo aquel que quiera introducirse en este mundo con gran cantidad de ejemplos que podremos utilizar en nuestros desarrollo.

Pero tener cuidado no tengáis la tentación de publicar directamente el ejemplo de Microsoft como si fuera vuestro que ya no seríais los primeros XD.

Después de esta experiencia que realmente he aprendido mucho he decidido pasar el juego a HTML5 y JavaScript para poderlo utilizar en diferentes plataformas, ya os informaré como me va y si la experiencia es igualmente positiva “seguro que si”.

No os olvidéis de descargar y probar mi juego ;-)

http://www.windowsphone.com/es-ES/apps/c2b100ff-45d8-4972-9d33-8bcbc2f148ba

[Evento] We ♥ JavaScript 2!

El sábado que viene día 28 de Abril, se celebra en Barcelona un encuentro de los profesionales en desarrollo web que apreciamos lo que significa javascript, lo hemos sufrido como todo el mundo, pero también sabemos valorar todo lo que nos aporta. Este evento es organizado por Agile-Barcelona, Runroom y Softonic, un evento de mañana y tarde .

Agenda

10:00 – 11:00 APRETURA – RECEPCIÓN
11:00 – 11:30 Charla sobre CoffeeScript
12:00 – 12:30 Networking
12:30 – 13:30 Charla sobre Game Development
13:30 – 15:00 COMIDA (cortesía de Softonic)
15:00 – 18:00 Workshop Backbone.js
15:00 – 18:00 Workshop PhoneGap.js

* Importante: Los workshops son en paralelo, de modo que te rogamos que únicamente saques ticket en uno de los dos.

Si tenéis pensado asistir daros prisa que solo quedan pocas plazas, yo ya me he registrado ;-)

http://welovejs.es

 

Posted: 20/4/2012 18:16 por Marc Rubiño | con no comments
Archivado en: ,
Microsoft MVP ASP.NET/IIS 2012

Segundo año consecutivo que he recibido la grata noticia desde Microsoft que he sido nombrado nuevamente Microsoft MVP en ASP.NET / IIS para este 2012.

Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2012. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de ASP.NET/IIS a lo largo del pasado año.

La verdad que es una experiencia inolvidable poder participar en esta comunidad y que se te valore por ello, pero lo más importante y con lo que realmente me quedo es con las personas que he conocido durante todos estos años y que me han ayudado siempre que lo he necesitado y nunca me ha faltado su apoyo. Si los tuviera que nombrar a todos seguramente me dejaría a alguno, pero desde aquí si que me gustaría nombrar a dos personas muy activas en la comunidad que este año se han quedado sin reconocimiento por parte de Microsoft, pero estoy seguro y conociendolos muy bien, sé que ellos seguirán aportando y ayudando a todo el mundo que lo necesite y seran nuevamente nombrados MVP. Un saludo muy fuerte para Toni Recio y José Miguel Torres.

Espero poder seguir aportando mi granito de arena y agradecer a Microsoft este reconocimiento.

 

Cross-Posting: http://mrubino.net/ 

 

 

Posted: 3/4/2012 8:17 por Marc Rubiño | con 1 comment(s)
Archivado en: ,
Exprime la potencia asíncrona en IIS

Una aplicación ASP.NET sobre IIS escala muy bien y tiene muy buen resultado cuando hablamos de peticiones por segundo, pero la cosa puede mejorar cuando hablamos de conexiones concurrentes.

Teniendo en cuenta que cada vez más nuestras aplicaciones son asíncronas, está aumentando la cantidad de peticiones que nuestra aplicación tiene que soportar .

Por defecto ASP.NET 4.o acepta 5.000 peticiones concurrentes por CPU

Peticiones concurrentes por CPU:

Una aplicación ASP.NET en modo integrado bajo IIS7 nos permite configurar cómo administrar los subprocesos y como poner en cola las solicitudes cuando la aplicación está hospedada en un grupo de aplicaciones de IIS.

Los valores applicationPool se aplican a todos los grupos de aplicaciones que se ejecutan en una versión determinada de .NET Framework. La configuración está contenida en un archivo aspnet.config. Hay una versión de este archivo para las versiones 2.0 y 4 de .NET Framework. (Las versiones 3.0 y 3.5 de .NET Framework comparten el archivo aspnet.config con la versión 2.0.)

  • maxConcurrentRequestPerCPU: Especifica cuántas solicitudes simultáneas permite ASP.NET por CPU.
  • maxConcurrentThreadsPerCPU: Especifica cuántos subprocesos simultáneos se pueden estar ejecutando para un grupo de aplicaciones para cada CPU. Esto proporciona una manera alternativa de controlar la simultaneidad de ASP.NET, ya que puede limitar el número de subprocesos administrados que se pueden usar por CPU para atender las solicitudes. De forma predeterminada este valor es 0, lo que significa que ASP.NET no limita el número de subprocesos que se pueden crear por CPU, aunque el grupo de subprocesos de CLR también limita el número de subprocesos que se pueden crear.
  • requestQueueLimit: Especifica el número máximo de solicitudes que se pueden poner en cola para ASP.NET en un único proceso. Cuando dos o más aplicaciones ASP.NET se ejecutan en un único grupo de aplicaciones, el conjunto acumulativo de solicitudes que se realizan a cualquier aplicación del grupo de aplicaciones está sujeto a este valor.

Para configurar nuestra aplicación que trabaja con el framework 4.0 x64

  1. fichero de configuración :
    • %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
  2. Modificar el fichero 
1 <configuration>
2 <system.web>
3 <applicationPool maxConcurrentRequestsPerCPU="5000"
4 maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000" />
5 </system.web>
6 </configuration>

 

Peticiones concurrentes por Aplicación:

Si lo que queremos es controlar la peticiones concurrentes por aplicación nos tendremos que ir a la configuración serverRuntime de nuestro servidor IIS.

  • appConcurrentRequestLimit: Especifica el número máximo de solicitudes que pueden poner en cola para una aplicación. El valor predeterminado es 5.000.

Modificamos la configuración del servidor:

  1. Abrimos el fichero de configuración:
    • %windir%\System32\inetsrv\config\applicationHost.config
  2. Buscar el elemento serverRuntime
  3. Modificar la propiedad appConcurrentRequestLimitque por defecto son 5.000

 

1 <serverRuntime appConcurrentRequestLimit="250000" />

 

Además se puede controlar el tamaño de las cola que utiliza ASP.NET cuando se supera la cantidad de solicitudes por CPU estableciendo requestQueueLimit de processModel.

 

1 <processModel autoConfig="false" requestQueueLimit="250000" />

 

Con todas estas modificaciones podemos controlar mucho mejor el rendimiento de nuestra aplicación y potenciar la gran cantidad de peticiones que se verán incrementadas con el uso de peticiones asíncronas.

Cross-Posting: http://mrubino.net 

 

 

Posted: 21/3/2012 16:54 por Marc Rubiño | con no comments
Archivado en:
MVP Summit 2012

Por primera vez he podido asistir al evento anual que organiza Microsoft dedicado a los MVP de todo el mundo llamado MVP Summit 2012.

Miles de personas reunidas con un mismo objetivo y con la posibilidad de ver las instalaciones que tiene Microsoft en Redmond.

Mi experiencia a este aspecto es totalmente positiva, poder estar una semana con mis colegas y conocer a gente de todo el mundo y especialmente al grupo de Españoles + Andorra, con los que pasé muy buenos momentos. Poder conocer a los integrantes del equipo de producto es otra oportunidad que no se puede explicar.

Nos hablaron de las novedades que se han lanzados durante estos días sin realmente darnos ninguna noticia bomba y pudimos jugar con las nuevas betas a la vez que el resto del mundo.

Está claro que si Microsoft me vuelve a reconocer con el nombramiento MVP nuevamente, no dejaré de asistir a esta convocatoria porque realmente vale la pena.

Y como una imagen vale más que mil palabras…

Posted: 7/3/2012 15:20 por Marc Rubiño | con no comments |
Archivado en: ,,
Optimización Web Sprites CSS

La ventaja de utilizar sprites para nuestros efectos con imágenes, es que no tenemos que esperar a que las imágenes se carguen individualmente, ya que solo tendremos una imagen principal para obtener el mismo efecto.

Piensa la cantidad de descargas que tiene que efectuar el navegador para cada una de las pequeñas imágenes que normalmente utilizamos en nuestras webs. Si todas estas pequeñas descargas la disminuimos en una principal reduciremos el tiempo de descarga de la página de una manera considerable.

El ejemplo más utilizado sería los tres estados de un ratón “normal, al pasar por encima con el ratón y al presionar”. Si utilizas tres imágenes independientes el usuario l pasar el ratón por encima del botón puede experimentar un retardo al mostrar la nueva imagen porque el navegador la tiene que descargar. Pero si utilizamos sprite con CSS este efecto indeseado desaparece a la vez que optimizamos la descarga.

Ejemplo 1: Imágenes por separado.

Imagen 1

Imagen 2

Imagen 3

El CSS para dar efecto al botón.

 

01 .btnSinSprite
02 {
03 width: 211px;
04 height: 64px;
05 background: url(../../Content/btn1.png);
06 border: black solid 0px;
07 cursor: pointer;
08 }
09 .btnSinSprite:hover
10 {
11 background: url(../../Content/btn2.png);
12 }
13 .btnSinSprite:active
14 {
15 background: url(../../Content/btn3.png);
16 }

 

Ejemplo 2: Imagen en Sprite.

Imagen

El CSS para dar efecto al botón.

 

01 .btnConSprite
02 {
03 width: 211px;
04 height: 64px;
05 background: url(../../Content/btnS.png)0 0;
06 border: black solid 0px;
07 cursor: pointer;
08 }
09 .btnConSprite:hover
10 {
11 background: url(../../Content/btnS.png)0 135px;
12 }
13 .btnConSprite:active
14 {
15 background: url(../../Content/btnS.png)0 70px;
16 }

 

Lo importante de utilizar una sola imagen es poder posicionar el fondo mediante la posición x-y, y jugar con el tamaño . De esta manera se muestra la porción de la imagen que necesitamos en cada momento.

Como se puede observar con las imágenes individuales tenemos tres descargas de 3,3KB que han tardado 48ms y con una imagen tipo sprite tenemos solo una descarga de 8,19KB que se ha descargado en 15ms. Una buena mejora con un simple botón imaginaros si optimizamos todas nuestras imágenes de la página.

Ejemplo 1

Ejemplo 2

Con esto ya tenemos un pasito más para poder tener nuestra web un poco más optimizada y para que veáis que esto es una buena práctica os pongo la colección de iconos que utilizan los controles JQuery UI en sus temas.

Cross-Posting: http://mrubino.net 

 

 

Posted: 14/2/2012 10:26 por Marc Rubiño | con 2 comment(s)
Archivado en: ,
Web Deploy – config Transformation

Una de las utilidades que contamos los desarrolladores web en Visual Studio 2010 y que por mi experiencia veo que no se utiliza mucho. Es la transformación de ficheros de configuración.

A quien no le ha pasado que ha realizado un despliegue al entorno de producción y se ha dejado el modo debug activado o la cadena de conexión a la de test. Pues Visual Studio nos permite poder evitar esto de una manera muy fácil y además automática, para que no nos tengamos que preocupar de si lo hemos configurado todo correctamente para el despliegue.

Ficheros de Transformación

Una de las situaciones que habitualmente nos encontramos en los proyectos, es que tenemos que tener diferentes ficheros de configuración para cada uno de los entornos de los que contamos.

No es lo mismo hacer un despliegue para el entorno de Desarrollo que para Pre-Test o Producción. Por eso ahora disponemos de la posibilidad de modificar el fichero de configuración dependiendo de donde queramos publicar nuestra aplicación web.

Lo primero que tenemos que hacer es crear una configuración de compilación que la podemos definir por ejemplo para cada entorno en el que trabajaremos con las diferentes configuraciones.

Podemos crear una configuración nueva o copiar de otra existente.

Una vez que tengamos las configuraciones creadas, hacemos clic con el botón derecho en el fichero de configuración y añadimos los nuevos ficheros de transformación.

Tendemos que tener tantos ficheros de transformación como diferentes configuraciones necesitemos en nuestros despliegues.

¿Qué son los ficheros de Transformación?

Los ficheros de transformación, son ficheros XML que utilizan los atributos XML para especificar que se tienen que modificar o eliminar del fichero web.config.

Por ejemplo el fichero de transformación de la publicación en Release elimina el famoso atributo Debug=true.

 

1 <?xml version="1.0"?>
3 <system.web>
4 <compilation xdt:Transform="RemoveAttributes(debug)" />
5 </system.web>
6 </configuration>

 

XML-Document-Transform

Este espacio de nombres tiene dos propiedades Principales:

  • Locator:Se seleccionan los elementos que coinciden con la expresión XPath combinada.
    • Locator=”Match(key)” – Selecciona los elementos que concidan con el atributo key.
  • Transform:Especifica la transformación de elemento o elementos seleccionados con la propiedad locator.
    • Replace: Sustituye el elemento o primer elemento seleccionado por el informado.
    • Insert: Inserta un nuevo elemento como podría ser una nueva cadena de conexión, al final de la colección.
    • InsertBefore: Inserta un nuevo elemento justo antes del elemento seleccionado.
    • InsertAfter: Inserta un nuevo elemento justo después del elemento seleccionado.
    • Remove: Elimina el elemento o primer elemento seleccionado.
    • RemoveAll: Elimina todos los elementos seleccionados.
    • RemoveAttributes: elimina el atributo especificado de los elementos seleccionados.
    • SetAttributes: Modifica los atributos especificados de los elementos seleccionados.

Los ejemplos más utilizados serían:

  1.  
    1. Modificar el valor de una propiedad personalizada de la configuración por su clave.

 

1 <add key="UrlEscritura" value="http://test/ Solicitudes/ServicioEscritura.svc" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>

 

  1.  
    1. Modificar una cadena de conexión por su nombre: perfecto si atacamos a diferentes bases de datos en cada entorno.

 

1 <connectionStrings>
2 <add name="SqlCon" connectionString="Data Source=server;Initial Catalog=test;" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
3 </connectionStrings>

 

  1.  
    1. Eliminar el famoso atributo de modo Debug cuando compliamos en Release:

 

1 <system.web>
2 <compilation xdt:Transform="RemoveAttributes(debug)" />
3 </system.web>

 

Conclusión

Si nos preocupamos un poco en tener diferentes configuraciones de compilación para nuestros entornos, además de facilitarnos los despliegues y su configuración de forma automática.

También nos evita los típicos errores por descuido que tantos problemas nos suelen dar en los despliegues.

Cross-Posting: http://mrubino.net 

 

 

Posted: 31/1/2012 20:16 por Marc Rubiño | con 5 comment(s) |
Archivado en: ,
Push con SingalR

Últimamente se está oyendo hablar mucho de SignalR en los en tornos de ASP.Net y no es para menos.

Los programadores web estamos acostumbrados a hacer peticiones al servidor “Pull” para poder consultar cualquier cosa y en más de una ocasión hemos tenido que tirar de un timer en el cliente para que cada X-tiempo consulte un recurso del servidor e ir informando al usuario del progreso de una tarea o de los datos que se tienen que actualizar constantemente.

Para evitar esto podríamos utilizar a día de hoy varias opciones como la API de html5 WebSocket que está en fase borrador y ha tenido algún problema de seguridad, podemos utilizar el servidor Openfire con el protocolo XMPP o servidor Node.js con la librería Nowjs . Pero la ventaja que proporciona SignalR frente los otros es que esta especialmente diseñado para aprovechar las características de las aplicaciones ASP.NET MVC tanto el lado del servidor como la parte cliente.

Como empezar

Para empezar tenemos que instalar la librería que tenemos disponible desde Nuget.

Tienes que tener en cuenta que tiene dependencias con la librería JQuery .

El Servidor

En el servidor solo necesitamos una clase que implemente Hub y si queremos hacer una devolución al cliente solo tenemos que añadir una expresión dinámica a Clients que se resolverá en tiempo de ejecución.

 

 
1 public class NotificationHub : Hub
2 {
3 public void Notificar(string valor)
4 {
5 Clients.AddValor("Informamos al cliente");
6 }
7 }

 

El cliente

Recordar la dependencia con JQuery y además hay que poner una referencia a “/Signalr/Hubs” que es donde se crearan los scripts dinámicamente para las llamadas al servidor.

 

 
1 <script type="text/javascript">// <![CDATA[
2 src</span>="/Scripts/jquery-1.7.1.js" type="text/javascript">
3 // ]]></script>
4 <script type="text/javascript">// <![CDATA[
5 src</span>="/Scripts/jquery.signalR.js" type="text/javascript">
6 // ]]></script>
7 <script type="text/javascript">// <![CDATA[
8 src</span>="/Signalr/Hubs" type="text/javascript">
9 // ]]></script>

 

 

1 $.connection.hub.start();
2 var hub = $.connection.notificationHub;
3 hub.AddValor = function (valor) {
4 alert(valor);
5 };

 

1. Abrimos la conexión con el servidor.
2. Inicializamos nuestro hub donde haremos las llamadas.
3. Definimos la función de devolución para actuar cuando el servidor nos informe.

Ya esta !!!! Es súper sencillo !!!!

EJEMPLO

Haré un pequeño ejemplo para que se vea toda su potencia en acción. Imaginaros un control de encuesta donde sea el servidor el que te informe que sus datos se han actualizado y solo permita votar una vez al usuario, toda la lógica estará en el servidor y no en la UI, de esta manera no mezclamos responsabilidades.
Utilizaré la librería jqplot.js para mostrar la gráfica de la encuesta en tiempo real.

Servidor

Primero crearé la parte del servidor donde estará la lógica de los votos.

  

01 public class NotificationHub : Hub
02 {
03 public void Notificar( string valor)
04 {
05 if (valor != null && Encuesta.Instance != null
06 && Encuesta.Datos.ContainsKey(valor))
07 {
08 var clientId = Context.ClientId;
09 if (Encuesta.Usuarios.Any(u => u == clientId))
10 {
11 // El usuario ya ha votado no hay que actuar
12 // ni informar de actualizaciones
13 }
14 else
15 {
16 Encuesta.Usuarios.Add(clientId);
17 Encuesta.Datos[valor]++;
18 var resultado = Encuesta.Datos.Keys.Select(
19 key => new List</pre>
20 ()
21 <pre>
22 {
23 key, Encuesta.Datos[key]
24 }).ToList();
25
26 // Informamos al cliente
27 Clients.AddValor(resultado);
28 }
29 }
30 }
31 }

 

Esta clase controla si el usuario ya ha votado y si no lo añade a la lista para no permitir votar la próxima vez que llame el mismo cliente y como se puede observar, tenemos acceso al identificador del cliente para controlar quien es el que hace la llamada, pero además podemos acceder al dentity para hacer un seguimiento más exhaustivo del usuario y sus credenciales.

Luego si el voto es de un elemento correcto le incrementa el número de votos y retorna a todos los clientes conectados los nuevos datos de la encuesta actualizada.

El cliente llamara a Notificar(valor) para informar del voto y estará en espera que el servidor actualice los datos con AddValor(resultado).

Cliente

Tendremos una vista con varios radio buttons para seleccionar las opciones de la encuesta y un botón que lanzara la llamada al servidor con la selección del usuario.

 

 
01 $(function () {
02 inicializarEncuesta();
03 $("#btnSendNotificacion").click(function () {
04 var voto = $('input:radio:checked').val();
05 hub.notificar(voto);
06 });
07 $.connection.hub.start();
08 var hub = $.connection.notificationHub;
09 hub.AddValor = function (valor) {
10 $.jqplot('chart1', [valor], chartOption()).replot();
11 };
12 });

 

Si el servidor devuelve nuevos datos “AddValor” entonces repintaremos el gráfico con la nueva información.

De esta manera todos los usuarios conectados a la encuesta reciben las actualizaciones en tiempo real.

Conclusión

SignalR es un Framework potente y fácil de utilizar que nos permite mantener conexiones abiertas con el servidor de ASP.NET.
Con este tipo de librerías podemos empezar a realizar aplicaciones realmente colaborativas y en tiempo real, donde se definen mejor las responsabilidades gracias a las llamadas Push y nos ayuda a no agregar lógica de negocios en nuestras UI.

 

Cross-Posting: http://mrubino.net 

 

 

Posted: 17/1/2012 21:10 por Marc Rubiño | con 2 comment(s)
Archivado en:
Deserializar JSon a tipo anónimo .Net

En ciertas ocasiones podemos necesitar deserializar un objeto pasado desde un cliente en formato JSon a un tipo .net anónimo. Por ejemplo si utilizas MongoDB con el driver NORM y pretendes filtrar u ordenar de una manera dinámica, es difícil pasar estos objetos a la query para poder generar un filtro dinámico.

Para hacernos una idea esta sería una consulta paginada y con un filtro sencillo con NORM:

1 //NoRM anonymous objects:
2 return GetRepository().GetCollection("Personas")
3 .Find(
4 new { Nombre = Q.IsNotNull() }, //Where
5 new { Fecha = OrderBy.Descending }, //OrderBy
6 10, // Nº elementos de la secuencia "Skip"
7 0 // Primer elemento de la secuencia "Take"
8 );

 

Esta consulta nos devolvería las 10 primeras personas con Nombre que no sea null.

Tanto al utilizar los tipos anónimos como en las consultas LinQ se tiene que especificar la propiedad por la que se quiere filtrar u ordenar y eso nos limita a la hora de intentar hacer estas consultas de forma dinámica.

Parara hacer una prueba crearemos un tipo específico para utilizar en las consultas desde javaScript.

Lo ideal sería:

1 public class QueryRequest
2 {
3 public int Pagina { get; set; }
4 public int Registros { get; set; }
5 public object Orden { get; set; }
6 public object Filtro { get; set; }
7 }

 

Con este tipo nos pasarían como parámetros lel número de página, la cantidad de registros y además un object para filtrar y otro object para ordenar.

Pero esto no funciona porque NORM no lo reconoce como tipo anónimo y si lo intentamos pasar como string tampoco funciona.

Ahora solo nos queda intentar deserializar directamente nosotros el objeto JSON en un tipo anónimo y para eso utilizaremos el tipo dynamic que tenemos disponible desde c# 4.

Para eso solo tenemos que deserializar un texto con datos en formato JSon utilizandoJavaScriptSerializerque te permite utilizar un tipo T.

1 var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
2 var ObjetoAnonimo = jss.Deserialize(strJson);

 

Con estas dos líneas lo tenemos solucionado y el nuevo tipo podría quedar de esta manera para facilitar la entrada de los datos como string y la salida como objeto dinámico.

01 public class QueryRequest
02 {
03 public int Pagina { get; set; }
04 public int Registros { get; set; }
05
06 // input string - output dynamic
07 private string orden;
08 public dynamic Orden { get { return DeserializarJSon(orden); } set { orden = value; } }
09
10 // input string - output dynamic
11 private string filtro;
12 public dynamic Filtro { get { return DeserializarJSon(filtro); } set { filtro = value; } }
13
14 private dynamic DeserializarJSon(string strJson)
15 {
16 var jss = new JavaScriptSerializer();
17 dynamic resultado;
18 try
19 {
20 resultado = jss.Deserialize(strJson);
21 }
22 catch (Exception)
23 {
24 resultado = new { };
25 }
26 return resultado;
27 }
28
29 }

 

Ahora nuestro objeto es capaz de devolver un tipo anónimo al consultar la propiedad Filtro y Orden.

01 public IEnumerable FindFiltradoDinamico( QueryRequest datos )
02 {
03 //NoRM anonymous objects:
04 return GetRepository().GetCollection("Personas")
05 .Find(
06 datos.Filtro as object,
07 datos.Orden as object,
08 datos.Registros,
09 datos.Pagina * datos.Registros
10 );
11
12 }

 

Ahora si tenemos las consultas preparadas para aceptar parámetros dinámicos.

01 public ActionResult Index()
02 {
03 var datos = new QueryRequest()
04 {
05 Pagina = 0,
06 Registros = 10,
07 Filtro = " { Edad : { '$gt': 15 } } ", //mayor de 15 años
08 Orden = "{ Nombre : -1}" // 1 Ascendente - -1 Descendente
09 };
10
11 var f2 = repositoryPersona.FindFiltradoDinamico(datos);
12
13 return View();
14 }

 

 

Cross-Posting: http://mrubino.net

 

 

 

Posted: 5/12/2011 11:26 por Marc Rubiño | con no comments
Archivado en: ,
Vistas & View Engines en ASP.NET MVC

Partiendo de que la intención de MVC es separar las responsabilidades de cada componente, me gustaría explicar cual es la responsabilidad de las vistas y como utilizarlas en ASP.NET MVC.

Lo que primero nos choca a los programadores que procedemos de los formularios web, es que han desaparecido los eventos y el famoso ciclo de vida, y eso se debe precisamente que ASP.NET MVC es mucho más natural en los protocolos HTTP y HTML en su tratamiento.

Mvc vs WebForms

Como se puede apreciar en la imagen los formularios web se basaban en los eventos para procesar una petición, entrar en el ciclo de vida del documento, tratar el evento, pintar los controles y devolver el resultado.

Sin embargo las peticiones en MVC son mucho mas simples y respetuosas con el protocolo HTTP. La petición la recibe el motor de rutas que mediante la URL decide cual es el controlador que la debe procesar, el Controlador puede consultar al modelo si es necesario y posteriormente devuelve un ActionResult que puede ser un fichero, datos en formato JSon, una vista, etc.

Vistas

Como ya he comentado la vista encapsula la lógica de presentación y NO tiene que contener lógica de la aplicación ni código de recuperación de datos.

Las vistas no son ficheros físicos ligados a una URL como en los formularios web. Cuando queríamos consultar un formulario teníamos que poner su ruta física www.miaplicacion/personas.aspx En MVC es el controlador el que decide que vista servir y eso facilita que las url sean descriptivas y que los buscadores puedan indexar mejor las páginas de nuestra aplicación “SEO Friendly“.

ViewBag:

Las vistas pueden recibir datos desde el controlador gracias al ViewBag que devuelve un diccionario de datos dinámicos. La gran diferencia con ViewData de las versiones anteriores de MVC, es que ViewBag aprovecha la opción de c#4 para generar tipos dinámicamente y evita tener que hacer conversiones en la vista para obtener el tipo adecuado de los datos.

En el Controlador: Definimos la propiedad que queremos pasar a la vista y el dato

1 ViewBag.Message = "Welcome to ASP.NET MVC!";

 

En la vista: desde la vista recuperamos el dato de una forma muy fácil.

1 <h2>@ViewBag.Message</h2>

 

ViewData vs ViewBag: la gran diferencia es que ya no tenemos la necesidad de hacer conversiones de los datos para poder tratarlos correctamente

1 @*Tipo Fecha con tipos dinámicos*@
2 <h1>@ViewBag.FechaVieBag.ToShortDateString()</h1>
3
4
5 @*Tipo Fecha con ViewData*@
6 <h1>@(((DateTime)ViewData["Fecha"]).ToShortDateString())</h1>
7

 

Tipos de Vistas de las que disponemos:

  •   View Page: Vista principal.
  • LayoutView: Pagina Maestra.
  • ViewContentPage: Vista que utiliza una página Maestra predefinida.
  • Partial View: Vista que se utiliza desde otra vista y no se puede llamar directamente. Como se utilizaban los user controls en los webForms. La vista parcial tiene acceso a su ViewData y al dela vista primaria, pero las actualizaciones de los datos de la vista parcial solo afectan a su viewData y no a la de la vista primaria.

View Engines

ASP.NET MVC utiliza view engines para generar las vistas y desde MVC3 disponemos de dos motores de vistas incluidos para utilizar directamente.

  • ASPX: Es el motor de vistas de ASP.NET con tipos personalizados “ViewPage, ViewMasterPage y ViewUserControl” que heredan de los tipos de páginas existentes .aspx, .ascx, .master.
  • Razor: Motor de vistas más cercano para los programadores de C# o VB
  • Otros:

Convenciones

Hay un par de convenciones que nos afectan al trabajar con las vistas y nos ahorran interminables ficheros de configuración.

  • Return View(): no tenemos que especificar explícitamente que vista estamos devolviendo, porque si no lo hacemos utilizará el nombre de la acción para encontrar la vista. Este ejemplo retorna la vista Create.
1 // GET: /Peliculas/Create
2 public ActionResult Create()
3 {
4 return View();
5 }

 

  • Estructura Vista – controlador: Los controladores se tendrán que llamar MyNombreController y las vistas estarán en una carpeta llamada MyNombre dentro de la carpeta Views. De esta manera el controlador encontrará la vista sin problemas.

En esta imagen las extensiones de los ficheros son .cshtml porque he utilizado el motor de vista Razor en C#, si utilizara VB seria .vbhtml y si utilizara el motor de vista ASPX sería (.aspx, .ascx, .Master)

Creo que con esto hemos visto todo lo que tiene que ver con las vistas en MVC 3

Cross-Posting: http://mrubino.net

 

 

Posted: 29/11/2011 12:52 por Marc Rubiño | con no comments
Archivado en:
[webCast] Auges MVC 3 + Html5 + CSS3

Os recuerdo que este lunes grabaremos el webCast sobre MVC 3 y Html5 con Visual Studio 2010 con la gente de Auges el grupo de usuarios de ASp.Net Spain.

Después de participar en el Barcelona Developer Conference tengo la oportunidad de repetir evento pero esta ves online y con la posibilidad de hacerla completa y sin las restricciones de tiempo que mormalmente nos encontramos en los eventos presenciales.

Podéis acceder al registro en https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032500294&Culture=es-ES

Ademas recordaros que el Martes desde SecondNug tenéis otro webCast de Lluis Franco MVP de Visual C# sobre Mejorar el rendimiento con programación paralela.

Espero Veros a Todos ;-)

Cross-Posting: http://mrubino.net

 

Posted: 24/11/2011 23:52 por Marc Rubiño | con no comments
Archivado en:
Material BcnDevConf MVC + HTML

Esta semana se ha realizado el primer Barcelona Developer Conference 2011 y espero que no sea la última porque nos ha dejado a todos un gran sabor de boca y una innumerable lista de nuevos contactos.

Tenéis disponible el material y la presentación para que podáis jugar un poco con el ejemplo, ya que no tuvimos mucho tiempo para verlo todo.

Proyecto de Ejemplo : Folder

Para los que os supo a poco y tenga ganas de ver la charla completa seguro que no tendremos problemas de tiempo en el webCast que haremos el próximo lunes 28 en el grupo de usuarios de ASP.NET Spain

Nos vemos el Lunes

Cross-Posting:  http://mrubino.net

 

 

 

Posted: 21/11/2011 21:10 por Marc Rubiño | con 2 comment(s)
Archivado en: ,
[Evento] BDNDevConf: MVC + JQuery + Html5

 

Me encuentro en el CommunityDay 2011 de Fuengirola y desconecto un segundo de tanto networking, charlas y el hack-a-ton, para recordar que esta semana tendremos el evento Barcelona Developers Conference '11. Tres intensos días con 18 Master Sessions, 32 Sesiones, 2 Mesas redondas, 3 WorkShops entre otras cosas. Una oportunidad impresionante para coincidir todo tipo de profesionales del sector y ampliar nuestra red de contactos.

Ademas no desaprovechar la oportunidad para hacer un poco de autobombo y recordaros que el viernes 18 yo mismo daré una sesión sobre MVC, JQuery y HTML5.

Para más información podéis consultar la agenda en

http://bcndevcon.org/en/content/scheduling 

Espero que podáis venir al evento.

Cross-posting: http://mrubino.net/ 

 

 

Cargar scripts bajo demanda con JQuery

Quien no se ha encontrado alguna vez que se va añadiendo potencia y dinamismo a las páginas web con diferentes librerías y al final tenemos una página que carga un montón de ficheros que a veces no se utilizan porque el usuario no ha necesitado esa opción en ese momento en concreto. Y con la aparición hace tiempo de los MastersPages se ha aumentado esta práctica tanto si hablamos de webForms como con MVC. Pues gracias a JQuery podemos cargar las dependencias o ficheros .js que necesitemos solo cuando realmente se necesite esa funcionalidad de una forma dinámica y no tener que descargar todo al cargar la página. Solo tendremos que utilizar getScript para cargar un script remoto con una llamada asíncrona “AJAX” y además no tendremos problemas con cross-domain, porque utiliza JsonP para cargar el script entre dominios. Pero que mejor que un ejemplo para que quede claro el concepto.

Ejemplo:

Imaginaros que tenemos una aplicación con una búsqueda avanzada oculta que utiliza JQuery, un autocomplete y un watermark.

  • El botón para mostrar el formulario.

  • Se muestra el contenido del formulario al hacer click en el botón

  • El autocomplete está disponible


Lo normal sería cargar todos los scripts que necesitamos al cargar la página.

<script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script> <script type="text/javascript" src="Scripts/jquery.watermark.min.js"></script><script type="text/javascript" src="Scripts/JScript.js"></script>


Pero sería mucho más optimo cargar las librerías del watermark y el autocomplete solo cuando se muestra el formulario de búsqueda avanzada. ¿ NO ?

Pues para cargar los script bajo demanda sería:

$('#btnBusqueda').click(function () { $.getScript("Scripts/jquery-autocomplete.js", function (data, estado) { if (estado == 'success') { $("#tags").autocomplete({ source: availableTags }); } else{ alert("Error al cargar la librería autocomplete"); } }); $.getScript("Scripts/jquery.watermark.min.js", function (data, estado) { if (estado == 'success') { $('#tags').watermark('Buscar...'); } else{ alert("Error al cargar la librería watermark"); } }); $('.busquedaAvanzada').show(); });


Como se puede comprobar solo se cargan las librerías si el usuario hace click en el botón para ver el formulario de búsqueda, entonces se carga el script y se utiliza una función anónima la cual utiliza dos parámetors con el contenido del script y el estado de la solicitud.

Posibles estados:

  • “timeout”
  • “error”
  • “notmodified”
  • “success”
  • “parsererror”

Con este sencillo ejemplo podemos ver cómo podemos cargar scripts bajo demanda.

Posted: 5/10/2011 2:59 por Marc Rubiño | con 2 comment(s) |
Archivado en: ,
Instalar Windows 8 sin USB/DVD de inicio

Esta semana ha habido un gran revuelo con el BUILD y todo el mundo se ha vuelto loco intentando ser el primero en instalar windows 8 y poder probar la versión Preview Development.

Yo he tenido bastantes problemas para hacer la instalación desde un USB/DVD de arranque como explica Scott Hanselman en su blog sobre todo porque no quería comprar un USB de 16 GB solo para poder probar win8. La única opción que me quedaba era instalar la ISO en una máquina virtual como VirtualBox, pero tener un disco virtual de arranque es mucho más rápido y utilizas mejor los recursos del sistema, solo tienes que seleccionar el sistema operativo que quieres utilizar al encender el ordenador.

Después de muchas pruebas mi compañero Alberto Diaz me paso un link para poder hacer la instalación desde PowerShell que funciona de maravilla y sin necesidad de tener el famoso USB de 16 GB para realizar la instalación.

Como esta solución me ha parecido muy interesante recompilaré para la correcta instalación teniendo en cuenta que el origen de esta información la he sacado de SharpFellows .  

  1. Necesitamos la ISO de Win8 Developer Preview para instalar.
  2. Utilizar una aplicación como Virtual Clone Drive para utilizar directamente la ISO.
  3. Los Scripts de Instalación de naeemkhedarun que está en GitHub.
  4. Utilizar los Scripts que tienen tres parámetros ejecutar -->cmd --> PowerShell
    1. El path donde se creará el disco duro virtual "VHD"
    2. El tamaño de la imagen.
    3. La letra de la unidad del disco "Que no esté en Uso"
// Donde tengais los ficheros
C:\projects\CreateWindows8VHD> Import-Module .\Create-Windows8VHD.ps1
C:\projects\CreateWindows8VHD> Create-Windows8VHD 
        "C:\vhd\windows8preview.vhd" "30000" "X" 

      5.     Finalmente poner el nuevo disco como unidad de arranque.

//En mi máquina e instalación
C:\Windows\System32\bcdboot.exe X:\Windows

Una cosa que te puede pasar la primera vez que utilizas PowerShell es que te da un error de permisos de ejecución de los scripts. Esto se soluciona con el mismo PowerShell.

Set-ExecutionPolicy RemoteSigned

Todo listo ;-)      

Cross-Posting: http://mrubino.net 

 

Posted: 19/9/2011 22:43 por Marc Rubiño | con 3 comment(s)
Archivado en: ,
[Tip] Intellisense entre ficheros .Js

Dedicado a mi colega Pablo Nuñez que últimamente le veo muy desesperado con el uso de JavaScript. Pablo nunca pierdas la esperanza!!! Este truco es muy sencillo y nos sirve para poder tener la referencia de un fichero script desde otro fichero script y solo tenemos que insertar el path del fichero que queremos tener la referencia con tres barras estilo comentario.

Pero eso no es todo, también podemos personalizar la información que queremos mostrar como en el resto de nuestro código de la aplicación.

 

Espero que este truco sea de utilidad ;-)  

Cross-Posting: http://mrubino.net/

 

 

Posted: 12/9/2011 19:51 por Marc Rubiño | con 4 comment(s)
Archivado en:
CSS.3 – HTML.5 & Modernizr

A estas alturas nadie puede negar que Microsoft está haciendo una apuesta en firme para dar soporte a los estándares web y un buen ejemplo de esto es en los nuevos proyectos web MVC 3 tenemos la posibilidad de crear aplicaciones con HTML 5 y CSS 3. Pero una cosa que puede que haya pasado más desapercibido es la librería script Modernizr que viene incluido con los ficheros scripts del proyecto. La versión que viene incluida es la 1.7 pero actualmente ya tenemos disponible la versión 2.0.4.

¿Qué es Modernizr?

Modernizr es una librería javascript open-source que nos permite detectar que características de HTML5 o CSS3 que son soportadas por el navegador. De esta manera podemos crear paginas con las últimas funcionalidades que nos brindan estos nuevos estándares sin preocuparnos si el navegador lo soporta o no, porque esta librería nos avisará y nos brindará la posibilidad de utilizar otras librerías para simular esta funcionalidad.

Modernizr ofrece la posibilidad de controlar más exhaustivamente la experiencia de usuario atraves de la detección de funcionalidades a través de JavaScript.

Nuestro primer proyecto con HTML5 CSS3 y Modernizr

Para empezar a utilizar esta librería y dotar a nuestra aplicación de las últimas caracteristicas de Html5 y CSS3 lo primero que tenemos que hacer es crear un nuevo proyecto web y especificar que queremos utilizar la compatiblidad con HTMl5.

Una vez que ya tenemos el proyecto creado ya podemos empezar a utilizar la librería, porque MVC3 ya te incluye las referencias necesarias para poder trabajar desde el principio, si miramos la página maestra, veremos las referencias a las librerías script y seleccionamos el esquema correcto para la validación del código html5 del documento. "Se recomienda poner nuestras referencias de los estilos despues de la de modernizr por motivos de rendimiento" Lo siguiente que tenemos que hacer es añadir la clase no-js

<html class="no-js">

Modernizr remplazará esta clase con js y de esta manera podremos saber si javascript está habilitado en el navegador, ademas de las características que seon soportadas y no soportadas con el prefijo no- . Una vez ejecutada la página la clase del elemento html quedaría de esta manera con un IE9.

<html class="js no-flexbox canvas canvastext no-webgl no-touch
   geolocation postmessage no-websqldatabase no-indexeddb
   hashchange no-history draganddrop no-websockets rgba hsla
   multiplebgs backgroundsize no-borderimage borderradius
   boxshadow no-textshadow opacity no-cssanimations no-csscolumns
   no-cssgradients no-cssreflections csstransforms no-csstransforms3d
   no-csstransitions fontface video audio localstorage sessionstorage
   no-webworkers no-applicationcache svg inlinesvg smil svgclippaths ">

Como podemos observar en IE9 a día de hoy no soporta flexbox, webgl, touch, websqldatabase, indexddb, history, websockets, borderimage, textshadow, cssanimations, csscolumns, cssgradients, cssreflections, csstransforms3d, csstransactions, webworkers y applicationcache.

¿ Que podemos hacer con esta información ?

Por ejemplo si decidimos utilizar border-image de css3 y sabemos que en IE9 por el momento no es compatible, podemos utilizar una clase de estilos alternativa para mostrar un efecto sustitutorio, en este caso un borde con sombra.

En la página tendremos un contenedor con la class testBorderimg

<div id="cuadro" class="testBorderimg">Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Proin pretium pulvinar sodales. Vestibulum sem libero, congue pulvinar scelerisque eu, laoreet convallis tellus.
Fusce gravida lacinia dapibus. Pellentesque eget purus vitae elit iaculis accumsan in vel odio. In lorem ligula,
molestie at iaculis at, ultricies sit amet felis. </div>

Y en nuestra hoja de estilos tendremos la clase testBorderimg con el estilo border-image y modernizr la sustituirá por no-borderimage en los navegadores que no sea compatible esta opción.

.testBorderimg
{
    -webkit-border-image: url(border.png) 27 27 27 27 round round;
    -moz-border-image : url(border.png) 27 27 27 27 round round;
    width: 350px;
    padding: 5px;
    border-width: 15px;
}
.no-borderimage #cuadro
{
    width: 350px;
    padding: 5px 5px 5px 5px;
    border: thin solid;
    box-shadow: 0.2em 0.2em #CCC
}

La imagen que utilizo para el borde es:

En IE9 que no soporta border-image se vería de esta manera:

En Firefox 5.0 se vería:

De la misma manera podemos detectar que características de HTML5 que soporta el navegador:

    if (Modernizr.localstorage) {
        alert("window.localStorage is available!");
    } else {
        alet("no native support for local storage" );
    }

Pero eso no se queda ahí, como la librería no puede abarcar todas las posibles pruebas de nuestra web, te permite extender de una forma facil utilizando su propia API.

addTest() Plugin API

JavaScript method:
Modernizr.addTest(str, fn)
Modernizr.addTest(str, bool)
Modernizr.addTest({str: fn, str2: fn2})
Modernizr.addTest({str: bool, str2: fn})

Si te interesa esta librería y creo que si eres desarrollador web te tiene que interesar puedes obtener más información en su págima web.

http://www.modernizr.com/docs

 Cross-Posting: http://mrubino.net 

 

 

Posted: 26/7/2011 9:19 por Marc Rubiño | con no comments
Archivado en: ,,
Evento inaugural de catdotNet !!!

Sábado 2 de julio jornada inaugural de catdotNet

Este próximo sábado en la ciudad condal, en el Cybernàrium de Barcelona Activa, diversos grupos de usuarios .NET catalanes inician juntos un nuevo proyecto destinado a ayudarnos en el difícil proceso de mejorar como profesionales. No dejes escapar esta fecha tan destacada i aprovecha para conocer de primera mano todo lo que te propone el nuevo catdotNet, a la vez que tienes la oportunidad de aprender de profesionales con gran experiencia sobre tecnologías .NET Regístrate ahora mismo aquí per poder disfrutar de una mañana intensa con una agenda en este primer encuentro realmente de lujo:

Gestión de dependencias con NuGet

NuGet es un proyecto Open Source el cual facilita la gestión de dependencias de proyectos con librerías de terceros. Aprende como crear tus propios paquetes y repositorios de librerías para desarrollos internos y todas las posibilidades de gestión de dependencias de terceros para proyectos. Con José Miguel Torres, co-fundador de CatDotNet, R&D+i Manger en MRW y MVP en movilidad.

ASP.NET MVC 3 en la práctica

Sesión eminentemente práctica en la que veremos las características más importantes de ASP.NET MVC 3 como el motor de vistas Razor, el soporte para aplicar dependency injection, validaciones remotas, etc.

También veremos las últimas novedades acabadas de salir del horno como el soporte para HTML5 y la generación automática de vistas y controladores mediante Data Scaffolding. Con Marçal Serrate, Senior Architect en pasiona Consulting

Mejoras en la productividad con Entity Framework 4.1

El pasado abril, el equipo de ADO.NET liberó la versión final de Entity Framework 4.1 en la que se incluían dos nuevas características enfocadas a la mejora de la productividad: Code First y API DbContext. Estas mejoras proporcionan una API más limpia y más simple centrada en los escenarios más comunes, pero que también podemos utilizar en escenarios donde se requiera una funcionalidad más avanzada. En esta sesión ofreceremos una visión general de los dos enfoques de desarrollo ya conocidos: DataBase First y Model First, e introduciremos el nuevo patrón de desarrollo "CodeFirst", que nos permite definir nuestro modelo utilizando clases .NET, y utilizar estas clases para asignarlas a una base de datos existente o generar un nuevo esquema. Veremos también cómo podemos utilizar este modelo con la nueva API simplificada así como otras técnicas destinadas a reducir el tiempo de desarrollo utilizando Entity Framework. Con Álex Casquete, Coordinador en el DotNetClub de la UOC y Architect en pasiona Consulting.

JavaScript i Ajax para programadores ASP.NET

Las aplicaciones web modernas no serían posibles sin JavaScript, descubre de qué manera podemos utilizar JavaScript, JQuery y Ajax de una manera óptima en nuestras aplicaciones web ASP.NET y ASP.NET MVC. En esta charla lo que veremos es como de una forma totalmente práctica y con Visual Studio 2010, como se integran perfectamente JQuery y las llamadas asíncronas Ajax con nuestras aplicaciones ASP.NET y qué buenas prácticas tenemos que seguir para que nuestra web sea lo más óptima posible y cómo podemos depurar los scripts para solucionar posibles problemas. ¡Código, Código, Código! Con Marc Rubiño, fundador de LoNetCamp, Consultant en Renacimiento y MVP en ASP.NET

¡Te esperamos!

Sabemos que son fechas de playa, pese a todo, hemos hecho el esfuerzo de preparar una buena selección de temas, y nos gustaría tener la oportunidad de explicarte de primera mano que nos depara la vuelta de vacaciones. Tu asistencia es importante; catdotNet es un proyecto creado por la comunidad, para la comunidad, ¿quieres formar parte? ¡Te esperamos! (Para más información puedes visitar nuestra web en http://catdotnet.net )

 

 

Posted: 27/6/2011 12:16 por Marc Rubiño | con 2 comment(s)
Archivado en: ,
Más artículos Página siguiente >