JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Bloquear los botones mientras se envía un formulario

Un efecto bastante indeseable en una página web es que los usuarios puedan enviar al servidor dos o más veces una misma información. Esto suele ocurrir porque existe una latencia entre el cliente y el servidor que hace que, si el servidor es lento o si hay mucha información que enviar o recibir en el proceso, la página tarde varios segundos en desaparecer del navegador.  Por lo tanto un usuario impaciente puede pulsar varias veces el botón de envío, recibiéndose varias veces la información en el servidor. Esto, según sea el sistema que hemos diseñado, puede tener resultados desastrosos para nuestra aplicación. Evitarlo par aun botón concreto es muy sencillo. Basta con deshabilitarlo usando un código como este: 1: <input type="submit" value="Enviar!" onclick="this.disabled=true;"> De esta forma cuando se pulse el botón, aparte de efectuar su función ... [Más]

Detectar que la página actual está lista

Esto a simple vista es una tarea sencilla, ya que de toda la vida las páginas HTML disponen de un evento onload que nos permite detectar cuando el documento ha cargado por completo. Por ejemplo, si escribimos: 1: <body onload="doWhatYouNeed();"> 2: ...... 3: </body> En cuanto el documento esté completamente cargado se llamará de manera automática a la función doWhatYouNeed. Nota: A partir de ahora haré todos los ejemplos prácticos en inglés para facilitar su localización posterior a este idioma, así que no te extrañes de ver los nombres de las variables, métodos... e incluso la interfaz de usuario en el idioma de Shakespeare. Esto nos asegura que cuando se llame a la función todos los elementos de la página estarán cargados y listos para su uso, incluyendo los que hay que cargar en una segunda fase tras la carga del HTML de la págin... [Más]

Proveedores universales de ASP.NET: Membership y Roles fuera de SQL Server

Como todo programador de ASP.NET sabe, la mayor parte de las API de esta plataforma de desarrollo web están basadas en el modelo de proveedores. Para explicarlo de manera rápida, básicamente esto significa que entre la funcionalidad que el programador utiliza y el almacenamiento relacionado con ésta, existe un elemento intermedio llamado "proveedor" que desacopla ambas partes. De esta manera, si queremos utilizar otro tipo de almacenamiento basta con cambiar el proveedor en la configuración y listo. no es necesario tocar el código en absoluto, por lo que resulta muy cómodo y útil. El siguiente esquema (sacado de MSDN) ilustra la arquitectura de este modelo: Como vemos muchos servicios como los de seguridad (Membership y Roles), la personalización (Profile) u otros como el almacenamiento de la sesión o los WebParts, están basados en este modelo, representados por las cajas de la parte superior. Así, la información de los usuarios, los roles, los perfiles, las sesiones, etc... [Más]

Recibir resultados de una página en otra: Transferencias y Cross-page posting

Hay ocasiones en las que tenemos una página muy poblada de controles que se deben mostrar en pasos sucesivos. Desde una simple recogida de datos que se haya complicado un poco, hasta varios pasos de un asistente, por ejemplo. Existen muchas maneras de solucionar esta situación y hacer que las páginas estén un poco más despejadas. Por ejemplo, podemos usar un control Wizard nativo de ASP.NET Web Forms. Sin embargo una forma mucho más natural de conseguirlo es recibir los resultados de la primera página en una nueva que los procesa y continúa el flujo de la aplicación. De hecho, en los paradigmas de programación convencionales (o sea, en todo lo que no sea Web Forms, incluyendo ASP.NET MVC pero también PHP, etc...) realmente es como se ha hecho siempre: unas páginas pasan datos a otras para procesarlos. Transferencia en el lado del servidor En ASP.NET disponemos de la instrucción Server.Transfer que nos permite derivar la ejecución actual de una página hacia otra, como si se ejecutase... [Más]

Mi aplicación Web tarda muchísimo en arrancar: ¿Usas ensamblados firmados quizá?

Este es uno de esos problemas raros que, si nadie te lo cuenta, es dificilísimo que llegues a solucionar por tu cuenta. Y si lo haces vas a estar días rompiéndote la cabeza antes de descubrir qué pasa... Seguramente conocerás (o te sonará al menos) la tecnología Authenticode de Microsoft. Se trata de una forma de firma digital que nos permite verificar el origen de un código ejecutable (EXE o DLL), un documento o cualquier otro tipo de archivo. El uso de una firma Authenticode permite verificar el desarrollador de una aplicación, de modo que puedas estar seguro de que aquel programa que te bajaste de Internet es una copia legítima generada por su creador, y no una versión modificada  que contenga algún troyano u otros virus. Es decir, no prueba que el ejecutable sea inofensivo, sino que prueba que al menos lo ha creado alguien concreto. ahora ya es cosa tuya si confías o no en ese determinado fabricante. Así, al ejecutar un programa que te has descargado de Internet y que está ... [Más]

Simular notificaciones PUSH en una página Web

En mi último post describía la arquitectura que utilizan tanto iPhone como Windows Phone 7 para enviar notificaciones PUSH desde aplicaciones externas a los usuarios de los teléfonos. La comunicación entre el dispositivo y el servicio de notificaciones se basaba en una conexión “raw” permanentemente abierta entre ambos. Pero ¿cómo podemos simular algo así en una página Web? Hace poco un alumno de mi curso de preparación del examen 70-515 de desarrollo Web con tecnologías Microsoft, me preguntaba acerca de esta cuestión. En concreto la pregunta iba sobre sobre cómo conseguir el efecto de actualización automática de información que consiguen algunas páginas (como las de apuestas o de información bursátil) en las que el servidor envía información a los clientes sin que haya –aparentemente- una petición explícita... [Más]

Cómo migrar fácilmente de dasBlog a BlogEngine.NET

NOTA 22/08/2011: La migración descrita en este artículo es valida para cualquier versión de BlogEngine superior a la 1.6, incluyendo la 2.0 y la última 2.5 que es multi-blog. Si vas a albergar varios blogs migrados debes prestar especial atención a la parte final de redirecciones. Llevo haciendo mi blog desde Junio de 2004, es decir, hace casi 7 años. Lo inicié albergándolo dentro de un proyecto llamado GolemProject que estaba auspiciado por una Universidad (craso error), por lo que enseguida murió y tuve que albergarlo yo mismo en uno de nuestros servidores. En aquel entonces (2005) el sistema de blogging más interesante que había -escrito en .NET- me pareció que era dasBlog. Lo malo es que este proyecto está abandonado. su última versión salió hace dos años -en marzo de 2009- e incluso entonces no incluía ya ni la mitad de las cosas que se le suponen a un sistema de blogging moderno, por lo que era cuestión de tiempo (y de vencer la pereza) que acabase migrando a otro sistema. Des... [Más]

Cómo crear URLs amigables personalizadas con ASP.NET Web Forms

Una de las ventajas que aducen los defensores a ultranza de ASP.NET MVC es lo bonitas y apropiadas para SEO que quedan sus URLs. Y tienen razón. La típica URL para una página que muestre los detalles de un producto hecha con ASP.NET Web Forms tendría un aspecto análogo a este: http:///www.miservidor.com/VerProducto.aspx?IDProd=5 Sin embargo, la misma funcionalidad usando ASP.NET MVC sería más bien algo más simple, del estilo de: http:///www.miservidor.com/Ver/Producto/5 Estas URL estilo REST son muy útiles tanto de cara a hacer el sitio más amigable a los usuarios, como para facilitar la vida a las arañas de los buscadores, favoreciendo el posicionamiento de las páginas si éstas son parte de una aplicación pública. ¿Cómo podemos conseguir lo mismo en ASP.NET Web Forms? Conseguir lo mismo en nuestras páginas Web Forms "tradicionales" es muy sencillo desde que apareció ASP.NET 4.0. Lo único que tenemos que hacer es definir las rutas que queremos usar, exactamente de la misma m... [Más]

Internet Information Server (IIS) Express y Visual Studio 2010 SP1

Desde hoy por la mañana está disponible para descarga el Service Pack 1 de Visual Studio 2010. Trae algunas novedades (nada que ver con el SP1 de VS2008 que fue realmente un cambio gigantesco) y corrige decenas de bugs. Una de las novedades que trae respecto a desarrollo Web es la posibilidad de utilizar el recientemente aparecido IIS 7.5 Express para probar los desarrollos. IIS Express es una versión reducida del servidor de aplicaciones Web de Microsoft y nos proporciona una experiencia mucho más real a la hora de probar las aplicaciones, frente al habitual "Cassini" (o Web Development Server, como se le llama oficialmente). IIS Express contiene el motor de IIS y funciona exactamente igual que éste, por lo que te resultará muy fácil probar las configuraciones reales en él o, incluso, distribuirlo con tus propias aplicaciones en un momento dado. Lo puedes descargar desde aquí o instalarlo desde el Web Platform Installer. ... [Más]

Cambios en la renderización de controles de ASP.NET 4.0

En mi anterior post comentaba que ASP.NET 4.0 había cambiado la forma de renderizar sus controles Web nativos para hacerlos más compatibles con XHTML, y que esto podía causar algunos problemas con aplicaciones hechas en versiones anteriores y migradas a la actual. También mostraba la forma de solucionar el problema y forzar la generación de HTML compatible con ASP.NET 3.5. Lo que no comentaba era qué cambios exactamente se producen en el renderizado de estos controles ahora en ASP.NET 4.0, así que lo comento a continuación: Todos los controles renderizan XHTML Strict 1.0 Los controles de validación no renderizan estilos "inline" sino clases CSS. Deshabilitar controles que no sean de entrada de datos ya no produce por defecto controles con el aspecto deshabilitado (lo comentaba en la práctica en el post anterior) Algunos controles que usaban el atributo border=0 ya no lo hacen (por ejemplo tablas o imágenes) Los elementos <div> que se generan alrededor de los campos ... [Más]