Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
miércoles, 28 de diciembre de 2011
Microsoft es una compañía que nos tiene acostumbrados a giros extraños en sus políticas de comercialización y distribución de productos, y está claro que la nube no iba a permanecer ajena a ellos.

Windows AdzureHace un par de días, ante el asombro de los presentes, Fred Swarm (cloud manager para la región EMEA) anunció la próxima apertura de Adzure, la edición gratuita del servicio Windows Azure soportada por publicidad.

martes, 27 de diciembre de 2011
Enlaces interesantes: .NET, ASP.NET, Azure, HTML, CSS, javascript, Visual StudioEstos son los enlaces publicados en Variable not found en Facebook y Twitter del 18 al 23 de diciembre de 2011. Espero que os resulten interesantes. :-)

.Net

Asp.net

Azure / Cloud

Data access

Html/Css/Javascript

Visual Studio/Complementos

Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
viernes, 23 de diciembre de 2011
Feliz NavidadDesearos a todos unas muy felices fiestas en las que podáis disfrutar de la compañía de todos aquellos que os importan.

Y ya de paso, desearos también que el próximo año 2012 venga cargado de alegrías, prosperidad y nada más que cosas buenas. Al menos a ver si es para todos un pelín mejor de lo que ha sido el año que ahora cerramos ;-)

Nos seguimos viendo por aquí.
martes, 20 de diciembre de 2011
ASP.NET MVCHace pocas semanas profundizamos en los mecanismos de obtención de metadatos del modelo en ASP.NET MVC y vimos cómo extender el framework para dotarlo de vías alternativas desde las que obtener esta información usando un proveedor personalizado.

Sin embargo, no es este el único mecanismo de extensión del framework a este respecto: también podemos crear fácilmente nuevos atributos que aporten información extra de metadatos a las clases y propiedades del Modelo. Y esta es la razón de ser del interfaz IMetadataAware.
lunes, 19 de diciembre de 2011
Enlaces interesantes: .NET, ASP.NET, Azure, HTML, CSS, Visual StudioEstos son los enlaces publicados en Variable not found en Facebook y Twitter del 12 al 17 de diciembre de 2011. Espero que os resulten interesantes. :-)

Aprovecho además para pediros opinión sobre un nuevo formato de presentación de los enlaces, usando categorizaciones. De esta forma podréis acceder directamente a aquellos cuya temática os interese, en lugar de tener que leerlos todos para ver si hay alguno que al que valga la pena echar el vistazo. ¿Qué os parece? ¿Mejor así?

.Net

Asp.net

Azure / Cloud

Conceptos

Data access

Html/Css/Javascript

Visual Studio/Complementos

Otros

Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
AugesMañana, martes 20 de diciembre de 2011, a las 19:00h (GMT+1) en AUGES tendremos el placer de contar con la presencia de Luis Ruiz Pavón, alma mater del grupo y gran conocido en la comunidad de desarrolladores .NET, para explicarnos qué es, para qué sirve y cómo se usa la Inyección de Dependencias, especialmente enfocado al desarrollo con ASP.NET.
En este WebCast veremos una introducción a la inyección de dependencias en ASP.NET con ejemplos prácticos:
  • ¿Qué es la inyección de dependencias?
  • ¿Que nos aporta?
  • Patrones y anti-patrones.
  • ¿Dónde se construye el grafo?
  • Tiempo de vida de las dependencias.
  • Contenedores de dependencias (IoC Containers)
  • ¿Cómo se aplica todo esto en ASP.NET?

Ponente:
Luis Ruiz Pavón (Spenta - Beezy) - miembro y fundador de AUGES (www.auges.org) y uno de los grandes colaboradores de la comunidad de desarrolladores. Puedes seguirlo a través de su blog técnico (www.luisruizpavon.com) y de Twitter (@luisruizpavon).
Como siempre, se trata de un Webcast de asistencia es gratuita al que podéis registraros a través de la siguiente dirección:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032499034&Culture=es-ES

En resumen, se trata de un evento que no deberíais perderos si queréis construir aplicaciones y componentes ASP.NET mejor estructurados, flexibles, desacoplados, muy mantenibles y fáciles de probar usando pruebas unitarias.

Esperamos veros por allí ;-)

Publicado en Variable not found.
miércoles, 14 de diciembre de 2011
ASP.NET MVCUno de los aspectos más criticados por los desarrolladores cuando comienzan a trabajar con ASP.NET MVC es el hecho de tener que volver a resolver problemas que estaban ya más que solucionados en Webforms.

Y uno de estos casos es un detallito muy simple pero útil: establecer el foco de edición en un control concreto al cargar una página. En Webforms era suficiente con asignar al atributo defaultFocus del tag <form> el nombre del control que nos interesara, y ya lo teníamos solucionado; ASP.NET MVC no trae ninguna solución “de serie” para conseguirlo, aunque, como veremos en este post, no es mucho más complicado que la alternativa Webforms una vez hemos preparado la infraestructura necesaria.
martes, 13 de diciembre de 2011

Blogger invitado

Blogger invitado

Óscar Sotorrío Sánchez

Desarrollador independiente, MCP C#

Eterno aprendiz en esto de las tecnologías .NET y en especial con ASP.NET. Admirador de la filosofía de Internet y entusiasta de los nuevos modelos de negocio que rigen este mundillo.
Blog: oscarsotorrio.com
En un artículo anterior vimos una pequeña introducción de los objetos en JavaScript en el que se mostraron algunas características esenciales de los objetos en sí mismos. Continuamos ahora hablando de objetos y profundizando un poco en algunos conceptos.
lunes, 12 de diciembre de 2011
Esta semana no he tenido tiempo para ir publicando en Variable not found en Facebook y Twitter los habituales links, pero sí que he podido recopilar algunos, así que ahí van los hallazgos realizados del 4 al 11 de diciembre de 2011. Espero que os resulten interesantes. :-)
Y no olvidéis que habitualmente podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
lunes, 5 de diciembre de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 28 se noviembre al 3 de diciembre de 2011. Espero que os resulten interesantes. :-)

Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
martes, 29 de noviembre de 2011
ASPNETMVCEn ASP.NET MVC normalmente utilizamos atributos para aportar información adicional a las propiedades del Modelo, incluyendo detalles como su descripción textual, formato de presentación, tipo de datos, etc. Esta información puede ser utilizada desde la capa vista para generar etiquetas, editores y, en algunos casos, incluso lógica de edición o presentación en la página.

Sin embargo, los atributos en el propio código de la clase no son la única vía para especificar metadatos en el framework. En este post veremos cómo extender el framework para crear nuevas vías para especificar esta información.
lunes, 28 de noviembre de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 21 al 27 de noviembre de 2011. Espero que os resulten interesantes. :-)
Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en Variable not found
miércoles, 23 de noviembre de 2011
AUGES - ASP.NET User Group de EspañaLo primero, para el que aún no lo sepa, se ha cancelado por causas de fuerza mayor la charla de Luis Ruíz Pavón sobre inyección de dependencias en ASP.NET que estaba prevista para el próximo martes 29 de noviembre. Sentimos las molestias que esto pueda causar, pero lo primero es lo primero :-).

Sin embargo, como ya teníamos el cuerpo hecho a aprender cosas interesantes la semana que viene, tendremos el placer de contar con el gran Marc Rubiño, MVP en ASP.NET y fundador de LoNetCamp, que nos mostrará el lunes 28 de noviembre a las 19:00h (horario peninsular español) la potencia que aporta la unión de tecnologías como ASP.NET MVC, HTML5, CSS3 y JQuery.

Descripción del evento:

ASP.NET MVC + HTML5 + CSS3 + Jquery = La unión perfecta

Las aplicaciones web modernas nos exigen cada vez más utilizar estándares para dotar a nuestra aplicación de una vistosidad y usabilidad nunca visto hasta el momento. Con ASP.NET MVC podemos separar las responsabilidades de nuestra aplicación de una forma sencilla y con HTML5 y CSS3 podemos obtener los mejores resultados independientemente del navegador gracias a librerías como modernizr.

En este Webcast lo que veremos es cómo de una forma totalmente práctica y con Visual Studio 2010 podemos crear una aplicación web totalmente funcional.

¿Qué utilizaremos en esta práctica?

ASP.NET MVC v.3: Es una plataforma gratuita, Open Source y está incluida en .NET 4.0. Nos sirve para realizar aplicaciones ASP.NET utilizando el patrón MVC, separando las responsabilidades ofreciéndonos beneficios como desarrollo orientado a pruebas “TDD”, mejor soporte de SEO con URLs más limpias, etc.

HTML v.5: La quinta revisión del veterano HTML no finalizada, pero los navegadores se han lanzado a una lucha frenética para adaptar sus especificaciones. Esta versión ha tenido en cuenta las nuevas necesidades y nos ofrece una web semántica.

CSS3: La tercera revisión de la hoja de estilos en cascada, que nos permite separar la estructura del documento de su presentación.

JQuery: Librería script que encapsula la complejidad de JavaScript y nos permite realizar animaciones, interactuar con el DOM y extender la aplicación de una manera muy sencilla y viene incluido en los proyectos ASP.NET MVC.

Modernizr: Librería que nos permite validar si el navegador soporta alguna de las nuevas funcionalidades de HTML 5 y nos permite actuar en consecuencia. Para hacer nuestra aplicación realmente cross-browser.
Como siempre, podéis asistir desde casa o el trabajo (es un Webcast online), y la asistencia al evento es totalmente gratuita. Para acceder, simplemente debéis registraros en la siguiente dirección:
Mejora el rendimiento con Programación ParalelaAh, y los que ya teníais la fecha del 29 reservada para disfrutar con un Webcast de categoría, recordaros que ese mismo día podéis encontrar a Lluis Franco, MVP C# y un fenómeno de la naturaleza,  hablando sobre programación paralela en SecondNug, a las 19:30h (GMT+1).

Buena semana de eventos tenemos por delante, ¿eh?

Publicado en: Variable not found.
martes, 22 de noviembre de 2011
ASP.NET MVCEl sistema de validación en cliente de ASP.NET MVC, como sabemos basado en jQuery validate, es el encargado de mostrar u ocultar los mensajes de error asociados a cada campo conforme va comprobando su validez.

Los mensajes de error asociados a cada validador son almacenados inicialmente en atributos data-val-* sobre el control a comprobar, y cuando se detecta un problema de validación, son mostrados copiando su contenido al interior de la etiqueta <span> que el helper Html.ValidationMessage() habrá generado sobre la página.

Sin embargo, al hilo de una consulta reciente en los foros de ASP.NET MVC en MSDN, perfectamente contestada por el amigo Eduard Tomás, pensé que realmente tenemos poco control sobre cómo se muestran estos errores, así que me he puesto un rato a ver cómo podíamos conseguir introducir lógica personalizada en este punto aprovechando la flexibilidad que ofrece jQuery validate 1.9.

Salvo por la escasez de documentación de este componente, tomar el control en el momento de mostrar los mensajes de error es bastante sencillo. Basta con establecer una función en la propiedad showErrors de los settings del plugin, cosa que podemos hacer con el siguiente script de inicialización:
<script type="text/javascript">
    $(function () {
        var settings = $.data($('form')[0], 'validator').settings;
        settings.showErrors = function (errorMap, errorList) {
            // Aquí el código personalizado:
            [...]

            // Y si nos interesa, finalmente podemos
            // ejecutar el comportamiento por defecto

            this.defaultShowErrors();
        };
    });
</script>
(Por simplificar, estamos asumiendo que en el formulario hay un único tag <form>, que es el que capturamos con el selector).

La función showErrors() recibe dos parámetros. El primero es un “mapa” donde asociamos a cada clave (nombre del campo) el mensaje de error que tenga asociado. Así, por ejemplo, el valor de errorMap.Nombre será nulo si el campo “Nombre” del formulario no tiene ningún error (ha validado correctamente), o el texto del error en caso contrario.

En el segundo parámetro de la función encontraremos un array con los errores a mostrar. En cada elemento tendremos disponible la propiedad element, desde la que podemos acceder al control que ha generado el error, y message, donde podemos consultar o establecer la descripción del mismo.

Es importante tener en cuenta que la función showErrors() es invocada con mucha frecuencia durante el proceso de edición (pérdida de foco, obtención de foco, pulsación de teclas…), por lo que desde el punto de vista de la usabilidad no tiene demasiado sentido introducir en ella procesos bloqueantes (como puede ser un alert()) o demasiado largos en el tiempo, para evitar que se solapen.

Por ejemplo, en el siguiente código utilizamos el efecto “highlight” de jQuery UI para resaltar con un rápido destello el elemento en el que se ha detectado un error:
    settings.showErrors = function (errorMap, errorList) {
        for (var i = 0; i < errorList.length; i++) {
            var error = errorList[i];
            // error.element es el elemento que ha provocado el error
            $(error.element).effect("highlight", { times: 1 }, 100);
        }
        this.defaultShowErrors();
    };
En fin, algo no demasiado útil ;-P, pero interesante en cualquier caso para profundizar un poco en los misterios e interioridades de jQuery validate.

Publicado en Variable not found.
martes, 15 de noviembre de 2011
No es algo excesivamente frecuente, pero en ocasiones podemos necesitar limpiar el valor de un campo de tipo file (el que usamos para hacer los uploads) de un formulario, por ejemplo, para evitar que el usuario envíe un archivo que por cualquier motivo no deba ser subido al servidor.

O dicho de otra forma, imaginemos la siguiente porción de un formulario en pantalla, que podría ser generada con el código que podéis ver justo a continuación:
Campo de envío de archivos
<label for="archivo">Archivo a enviar:</label>
<input type="file" id="archivo" name="archivo" />
<input type="button" onclick="limpiarInputFile('archivo');" value="Limpiar" />

Y la pregunta en este momento sería, ¿qué código deberíamos implementar en la función limpiarInputFile() que estamos utilizando en el evento onclick si quisiéramos limpiar o inicializar el contenido del campo archivo?

Aunque de forma intuitiva podría parecer que basta con establecer el valor del campo a una cadena vacía, una prueba rápida nos demostrará que esto no es posible. Desde hace ya tiempo, por motivos de seguridad, los navegadores no permiten el acceso de escritura a la propiedad value en los campos de envío de archivos, por lo que nos encontramos una vía sin salida. Esto lo vemos con el siguiente código, utilizando jQuery:

    function limpiarInputfile(id) {
        var input = $('#' + id);
        var nuevoValor = "c:\\windows\\system32\\mspaint.exe";
        
        alert(input.val());       // Muestra "C:\Datos.dat"
        input.val(nuevoValor);    // Establecemos un nuevo valor
        alert(input.val());       // ¡¡Muestra "C:\Datos.dat"!!
    }

Como vemos, somos vilmente ignorados cuando intentamos establecerle un valor.

Pues bien, una posible solución consiste en eliminar del DOM el elemento <input type="file"> y volver a crearlo justo después en el mismo lugar. He visto por ahí varias implementaciones que obligaban a introducir este elemento dentro de un contenedor, pero he creado otra que creo que es más sencilla e igual de efectiva:

    function limpiarInputfile(id) {
        var input = $('#' + id);
        var clon = input.clone();  // Creamos un clon del elemento original
        input.replaceWith(clon);   // Y sustituimos el original por el clon
    }

Y eso es todo :-). Observad que lo único que hacemos es crean un clon del elemento original cuyo value por supuesto estará en blanco (recordad que esta propiedad no se puede establecer), y justo a continuación eliminamos el elemento original sustituyéndolo por este clon.

Si queremos generalizar este código e implementar esta funcionalidad de forma no intrusiva podríamos hacer lo siguiente:

    $(function () {
        $("input[type=file]").after(
            "<input type='button' class='limpiar-inputfile' value='Limpiar'>"
        );
        $(".limpiar-inputfile").click(function () {
            var input = $(this).prev("input[type=file]");
            var clon = input.clone();
            input.replaceWith(clon);
            return false;
        });
    });

Este código añade automáticamente un botón “Limpiar” a continuación de todos los <input type=file> de la página, implementando en el manejador del evento click la lógica de inicialización del componente que hemos visto antes. De esta forma, sólo se introducirá en la página el botón de limpiado cuando estén activados los scripts, que es en el único momento en que su ejecución tendrá sentido con la solución propuesta.

Espero que os sea de utilidad.

Publicado en: Variable not found.
lunes, 14 de noviembre de 2011
FuengirolaPues ya estamos de vuelta del evento que tanto tiempo llevábamos esperando: el Community Day 2011. Un día en Fuengirola (Málaga) repleto de sesiones interesantes, mucho tiempo para desvirtualizar compañeros a los que seguimos desde hace tiempo, y en todo momento disfrutando de la compañía de auténticos fenómenos a los que algunos sólo podemos ver en ocasiones señaladas como esta.

Desde aquí, dar la gracias a la organización y a todos los asistentes que han vuelto a conseguir que este evento sea una experiencia inolvidable.

Y para volver poco a poco a la normalidad, estos son los enlaces publicados en Variable not found en Facebook y Twitter del 7 al 10 de noviembre de 2011. Quizás poquitos en comparación con otras veces, pero espero que os resulten igualmente interesantes. :-)
Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
martes, 8 de noviembre de 2011
ASP.NET MVCEn la pasada charla sobre el sistema de validaciones de MVC 3 vimos un ejemplo, creo que bastante ilustrativo, de los proveedores de validación del framework. Concretamente, implementamos un proveedor capaz de obtener las anotaciones partiendo de las restricciones definidas en el web.config. Es decir, las reglas de comprobación como Required o StringLength no las definíamos a nivel de código mediante atributos, sino en el archivo de configuración, lo que podía aportar interesantes ventajas vistas a flexibilizar nuestras soluciones.

En este post vamos a ver un nuevo ejemplo de cómo utilizar el mismo mecanismo de proveedores, pero esta vez para conseguir de forma muy sencilla simplificar el código de clases del modelo en las que todas sus propiedades sean por defecto obligatorias, salvo aquellas en las que indiquemos expresamente lo contrario.
lunes, 7 de noviembre de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 1 al 6 de noviembre de 2011. Espero que os resulten interesantes. :-)
Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
miércoles, 2 de noviembre de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 24 al 31 de octubre de 2011. Espero que os resulten interesantes. :-)
Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
martes, 25 de octubre de 2011
The Tao of ProgrammingHace unos días charlaba con un colega sobre aspectos filosóficos del desarrollo de software, y me pareció curioso que no conociera “The Tao of Programming”, todo un clásico de la literatura friki, y lectura indispensable para los que nos dedicamos a esto.

Este libro, escrito en el año 1987 por Geoffrey James, recoge, en un humorístico tono de misticismo oriental, distintas historias y parábolas con geniales mensajes de fondo sobre calidad en la programación, gestión de proyectos y otros temas que siguen siendo válidos veinticinco años después.

Como probablemente habrá más lectores que no lo conozcan, me ha parecido interesante reproducirlo aquí traducido en su totalidad, por supuesto contando previamente con el permiso expreso del Sr. James.

¡Que aproveche!
Warning: Post largo. Muy largo ;-)
lunes, 24 de octubre de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter del 17 al 23 de octubre de 2011. Espero que os resulten interesantes. :-)
Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
jueves, 20 de octubre de 2011
AUGES - ASP.NET User Group de EspañaId apuntando en la agenda, si no lo habéis hecho ya, que el próximo martes 25 de Octubre a las 19:00 (horario peninsular español) tenemos en Auges un interesantísimo evento que, si sois desarrolladores web, no os podéis perder.

Para empezar, tendremos aquí a José Manuel Alarcón, del que poco se puede decir que no conozcáis ya: Ingeniero industrial, Microsoft MVP desde el año 2004, Director de Krasis, autor de cientos de artículos, varios libros, ponente en decenas de conferencias y charlas … vaya, uno de los grandes :-)

Y el tema elegido es de vital importancia para todos los que trabajamos en la web: la seguridad.
Programar es mucho más que la simple creación de aplicaciones que cumplen con la funcionalidad para la que fueron diseñadas. Existen otras muchas consideraciones que hacer y multitud de características tan importantes como la propia funcionalidad que se deben tener en cuenta: rendimiento, extensibilidad, facilidad de mantenimiento, etc... entre las que destaca especialmente la seguridad del código que se escribe

De poco o de nada sirve una aplicación que lleva a cabo su cometido principal pero que permite que casi cualquiera pueda acceder a la información que supuestamente protege o que, debido a la escritura de código descuidado, un competidor desleal impide su funcionamiento cuando más se necesita.

Y no, no llega con tener un buen cortafuegos si el fallo está en la lógica de la aplicación.

En esta charla se analizarán los principales puntos flojos de seguridad que suele haber en las aplicaciones Web ASP.NET, y se enseñará cómo evitarlos. Entre otros temas se tratarán la correcta configuración de IIS, la autenticación y autorización hechas correctamente, la suplantación de usuarios del sistema, las inyecciones de SQL, las secuencias de comandos entre sitios (XSS), los problemas de canonicalización, los ataques Cross Site Request Forgery (CSRF)...
Por supuesto, podéis asistir desde casa o el trabajo (es un Webcast online), y la asistencia al evento es totalmente gratuita. Para acceder, simplemente debéis registraros en la siguiente dirección:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032497158&Culture=es-ES

Publicado en: Variable not found.
martes, 18 de octubre de 2011
ASP.NET MVCHabía comentado que una de las novedades que ya podíamos disfrutar en la developer preview de MVC 4 era el sistema de compactación y minimización de scripts y CSS, y que, además de ser bastante útil y sencillo, podíamos utilizarlo a día de hoy en nuestras aplicaciones MVC 3 e incluso en ASP.NET Webforms.

Este mecanismo hace posible la creación de bundles, o paquetes de uno o varios archivos de scripts o estilos, que son optimizados en tamaño por el servidor y cargados desde las páginas en una única petición. El proceso de compactación se realizaría en servidor, pero sólo la primera vez, quedando almacenado en caché para las peticiones posteriores.