Pregunta típica: Cómo hacer que funcione un botón al pulsar ENTER en una página ASPX

Las páginas ASPX funcionan mediante la inclusión de un formulario único que contiene todo los controles de la página y que, al enviarlo, actualiza ciertos parámetros para mantener el ViewState, saber qué control ha provocado un evento, etc… El funcionamiento basado en un formulario provoca algunos comportamientos indeseados.


Por ejemplo, los cuadros de texto, por defecto, cuando tienen el foco (porque estás escribiendo en ellos) provocan el envío automático del formulario si pulsas ENTER. Si tienes el típico cuadro de búsqueda con un botón o un formulario de recogida de datos con un botón de enviar, al pulsar ENTER conseguirás que se envíe la página pero al no haber pulsado sobre el botón no se detectará el evento correspondiente y por lo tanto no se ejecutará el código del eento click de éste. El resultado es que no se actualiza correctamente la página y simplemente volvemos a tener la misma página exactamente igual y la búsqueda no funciona o los datos no se almacenan.


Seguro que te ha pasado muchas veces al visitar aplicaciones hechas con ASP.NET. De hecho es una de las típicas preguntas que le surgen a todo el mundo: ¿cómo evito esto?


En ASP.NET 1.x tenías que capturar con JavaScript el evento de pulsación de la tecla y actuar en consecuencia. Por suerte desdela versión 2.0 de ASP.NET (y posteriores), tenemos una propiedad estupenda que se puede ajustar en el formulario de la página llamada DefaultButton y que sirve precisamente para evitar este problema.


Así, si ponemos esto:



<form id=»Form1″ runat=»server» defaultbutton=»cmdBuscar»>


conseguiremos que alel hecho de pulsar ENTER y provocar un envío del formulario, en realidad será equivalente a pulsar el botón indicado. De este modo se evita el problema por completo y podemos procesar correctamente el evento 🙂


Por cierto, en la versión 2.0 también apareció una propiedad del formulario relacionada en cierto modo con esta y útil para no tener que scribir un sencillo script por nuestra parte: DefaultFocus. Como se puede esperar esta propiedad nos permite indicar qué control de los disponibles en nuestra página va a tener el foco al cargar la página (generalmente un cuadro de texto).


¡Espero que os sea útil!

Noticia del mes: Reflector pasa a manos de una empresa privada

Cualquier programador .NET que se precie conoce, usa constantemente y adora la herramienta Reflector de Lutz Roeder. se trata sin duda de una de las herramientas más potentes y útiles con las que podemos contar. Lo que habré aprendido yo usándola 🙂


El caso es que Reflector ha sido siempre el proyecto personal del bueno de Lutz, que lo ponía disposición de todo el mundo gratuitamente en su Web, para el bien de la humanidad. El hecho de no cobrar un duro es digno de admirar pues, desde mi punto de vista, Lutz podría ser multimillonario si se le diera por cobrar aunque fuera únicamente 4 o 5 euros por cada descarga. Yo pagaría sin duda unos cuantos más si los pidiera. Pero hasta ahora eso no ha ocurrido.



Por este motivo me sobresalté al recibir esta misma noche un correo electrónico de Lutz en el que anunciaba que había llegado un acuerdo con la empresa Redgate, muy conocida sobre todo por sus excelentes herramientas para SQL server, en virtud del cual esta empresa pasaba a poseer la herramienta (de hecho la URL original ya apunta a la web de Redgate como puedes comprobar) y a comprometerse a desarrollarla en el futuro. ¡ding, ding, ding! Todas las alarmas en marcha. Lo que parecía inevitable iba a pasar…


Pues parece ser que no. Según afirman en la propia Web de Redgate así como en una entrevista conjunta concedida por ambas partes la semana pasada, el acuerdo contempla que la herramienta siga siendo gratuita para siempre. Simplemente Redgate le dedicará los recursos que Lutz no puede dedicarle y no cobrará por ello. Obviamente ninguna empresa da nada totalmente gratis o al menos sin una contraprestación (aunque los apóstoles más ingenuos del Open source afirmen que sí y crean que depredadores tan reconocidos como Oracle, IBM o Sun son hermanitas de la Caridad y no que responden simplemente a una estrategia empresarial). En este caso me imagino que la contraprestación es la ingente publicidad gratuita y reconocimiento de marca que va a obtener Redgate con ello, lo cual me parece muy lícito.


De hecho se lo han hecho tan bien que Lutz afirma que no les ha facilitado la base de datos de correos electrónicos de usuarios de reflector que posee (que debe de ser gigantesca), y sólo recibirás correo de Redgate si te suscribes voluntariamente a su boletín, lo que es una estupenda buena práctica. Este hecho además tiene su valor especial al tratarse de EEUU un país con una regulación más laxa que la de Europa en cuanto a protección de datos (vamos, que no tendrían por qué hacerlo).


Así que ¡Chapeau por ellos! y creo que es un agran noticia para todos.

Hackeando un NAS Lacie o de como cualquier chorrada puede comprometer la seguridad de un sistema

El otro día os hablaba de un problemilla con un NAS que tenemos y alguno me ha comentado que cómo podía hacer para lanzar la línea de comandos ya que este tipo de sistema vienen completamente cerrados a cal y canto. Voy a explicar cómo hackearlo y veremos que esta es la prueba evidente de que cualquier chorrada por pequeña que sea puede ser un agujero de seguridad.


Resulta que en efecto el NAS viene completamente «capado». Lleva Windows XP Embedded y te deja acceder a través de Terminal Server pero te saca una interfaz muy restringida de administración que la verdad no merece la pena puesto que desde la interfaz web que trae se pueden hacer más cosas aún. Esta interfaz reducida tiene el aspecto de una página Web y es en realidad una pequeña aplicación ejecutable que es lo único que se ejecuta al arrancar. no tienes acceso a minimizarla, ni al escritorio, ni responde a las teclas rápidas de sacar el explorador (Windows + E), ni nada similar. Pero sí hay una tecla rápida que responde: CTRL + MAYUSCULAS + ESC, es decir, que puedes sacar el administrador de tareas. Con esto todo parece fácil ya, porque va a Archivo·Ejecutar y listo ¿no?. Pues no. Resulta que el administrador de tareas viene también «capado» y no te deja ejecutar nada:



Pulsa para aumentar


O sea, que por aquí vamos mal ¿o no?. Pues puede que no. Y es aquí en donde se demuestra lo de que cualquier minucia puede ser un problema y que los agujeros aparecen en el lugar más insospechado. Si vas a Ayuda·Acerca de aparece un diálogo con información y un enlace para leer el contrato de licencia, que es un simple archivo TXT. El problema es que han querido «capar» tanto el sistema que ni siquiera trae las asociaciones de archivos con los programas, por lo que cuando pulsas en el enlace para leer la licencia pasa esto:



Pulsa para aumentar


Así que a partir de este momento el sistema es nuestro. Al darle a seleccionar el programa desde una lista se nos abre un diálogo de selección de un programa. El único disponible es Internet Explorer que parece el único que está registrado, pero tenemos el botón de explorar, lo que nos abre un diálogo común de apertura de archivos:



Pulsa para aumentar


Ahora ya sólo queda pulsar con el botón derecho en cualquier parte y elegir la opción de «explorar» y voilá!, se nos abre un explorador de archivos en toda su capacidad:



Ahora sólo resta navegar a WindowsSystem32 y lanzar la línea de comandos o cualquier otra aplicación que nos interese dado que el login por Terminal Server lo has hecho como administrador.


Es una chorrada pero demuestra lo fácil que es saltarse muchas protecciones y además seguramente os servirá para otro tipo de dispositivos que tengan alguna versión de Windows wmbebida 🙂

Truco: cómo borrar todas las subcarpetas de una carpeta excepto unas cuantas

Borrar carpetas o archivos puede parecer una trivialidad y lo es en la mayoría de los casos. Como casi todo en la vida la cosa se complica con los grandes números. Si tenemos que borrar una gran carpeta con miles de archivos y muchos gigas de tamaño la cosa llevará tiempo y además se necesita tener bastante espacio libre en disco para hacerlo (el porqué de esto lo desconozco. Parece una paradoja pero es así).


Hoy me he encontrado en un atolladero así. Un pequeño NAS que tenemos en el DataCenter para hacer algunas copias de seguridad estaba repleto. En una carpeta conflictiva en concreto había unas 150 subcarpetas cada una de ellas con varios gigas, y miles de archivos y una estructura compleja de varias decenas de subcarpetas. Necesitaba borrar la mayor parte de ellas para hacer espacio (ya no se necesitaban) pero no lo podía conseguir desde el explorador de Windows. El proceso de todas formas iba a durar mucho tiempo. ¿Cómo puedo automatizar esto? El mayor problema además es que no tenía que borrar todas sino «casi» todas. En informática los «casi» son siempre los que suponen un reto ¿no? 🙂


Bueno, la solución más rápida y sencilla fue usar la línea de comandos. Ábrela y vete a la carpeta en la que quieres trabajar.


Lo primero es crear un archivo de texto con la lista de subcarpetas dentro de mi carpeta problemática. Necesitaba sólo los nombres de los archivos, sin nada más. El comando necesario es este:



dir /ad /b > carpetas.txt


De este modo creamos un archivo carpetas.txt que contendrá los nombres de todas las carpetas de la carpeta actual.


Ahora abre el archivo de texto y borra los nombres de las carpetas que quieres conservar. Con esto consigues una lista de carpetas a borrar. Ahora sólo necesitas iterar por ellas en un bucle eliminándolas, para lo que sólo tienes que escribir esto en la línea de comandos:



For /f «delims=» %n in (carpetas.txt) do rmdir /s /q «%n»


¡Listo! Tardará un montón también si hay muchas carpetas y son muy grandes, pero te hará el trabajo sin poner mucho de tu parte y de manera mucho más eficiente que usando la línea de comandos y siendo mucho más selectivo sobre lo que vas a borrar.


Yo, como es evidente, no soy especialista en sistemas ni mucho menos, así que espero que esto le sirva a otros que tampoco lo sean y a veces «les toque» 🙂


Nota: si quieres usar la última línea dentro de un archivo .bat y no directamente sobre la línea de comandos deberás usar doble porcentaje en lugar de uno simple para el nombre de la variable de bucle, así:



For /f «delims=» %%n in (carpetas.txt) do rmdir /s /q «%%n»


o de otro modo no te funcionará.

Consolidación de Scripts para mejora de rendimiento

Una de las mejoras sencillas y poco llamativas en primera instancia que ha incluido el Service Pack 1 de .NET 3.5 y Visual Studio 2008 es la consolidación de Scripts. Sin embargo es algo interesante que conviene conocer.


Se trata básicamente de evitar que el navegador tenga que descargar multitud de pequeños archivos de Script desde el servidor, sustituyéndolos de manera automática por una sola descarga combonada, que es más eficiente y rápida como demostraré enseguida.


Es la típica característica que va a pasar inadvertida para la mayoría de los programadores Web pero que es interesante, y por eso me ha apetecido contarla en detalle aquí. Para ello he desarrollado un ejemplo muy simple pero que da una idea de la utilidad de esta característica. En el siguiente vídeo muestro cómo funciona la consolidación de Scripts mediante las nuevas etiquetas CompositeScript. También muestro un control desconocido pero interesante y pensado para ayudarnos a trabajar con esta característica: el control ScriptReferenceProfiler.


Video 


Este vídeo es como los muchos que puedes encontrar, junto con la teoría correspondiente, en cualquiera de nuestros cursos online de campusMVP sobre tecnología Microsoft, sólo que en los cursos los vídeos son de mejor calidad porque no nos limitan los tamaños de SoapBox, YouTube y similares 🙂


¡Espero que os interese!

¿Qué hay de nuevo en el Service Pack 1 de .NET 3.5 y de Visual Studio 2008?

Como ya habréis visto anunciado en muchos sitios, desde hoy está disponible el Serive Pack 1 de Visual Studio 2008, que incluye muchas nvedades.


Las principales a destacar son las siguientes:


Plataforma .NET




  1. Mejoras de rendimiento de entre el 25 y el 40% en aplicaciones WPF. Y sin tener que cambiar ni una sola línea de código.


  2. Nuevos sistemas de acceso a datos: Entity Framework y Data Services, así como soporte para las nuevas características de SQL Server 2008.


  3. Algunas mejoras en WCF.

Visual Studio 2008:




  1. Soporte para SQL Server 2008 (salido la semana pasada)


  2. Mejores diseñadores de WPF.


  3. Diseñadores para acceso a datos con Entity Framework.


  4. Mejoras en Team Foundation Server relacionadas con el control de versiones, control de items de trabajo y migración desde Source Safe entre otras. Cabe destacar una gran mejora de rendimiento en servidores de TFS con gran cantidad de proyectos, tanto en el servidor como en el cliente.

En cuanto a lo que a mi me interesa, que es el desarrollo Web, las principales mejoras tienen que ver con la inclusión de Dynamic Data, para crear rápidamente aplicaciones orientadas a datos, los ADO.NET Data Services para exponer datos como servicios REST, el soporte para el historial del navegador en AJAX, mejoras en el Intellisense de JavaScript que ahora soporta a muchas bibliotecas conocidas como ExtJS o  Scriptaculous, y la posibilidad de combinar varios scripts en uno automáticamente para disminuir las descargas individuales de este tipo de archovos desde el servidor (lo que mejora el rendimiento).


Ah, también una cosa muy interesante: .NET 3.5 SP1 añade soporte para Click-Once en Firefox, que ahora está ya al alcance de esta estupenda forma de distribuir aplicaciones:



Y como detalle simpático comentar que además el SP1 cambia el icono asociado a Visual Studio, que ahora incorpora la versión en todos los tamaños de accesos directos:



Mi opinión personal


Me parece estupendo todo lo que sean avances, pero Microsoft debería plantearse el actual ritmo de innovación que tiene. Lleva varios años (desde que salió VS2005) dando una caña que no es normal. Cada vez es más dificil estar al día, incluso a la gente que está todo el día con esto (entre los que no me incluyo). Y luago hay quien dice que Microsoft no innova. Eso lo dicen los que no pasan de manejar Word, imagino.


Además, no sé qué manía ha cogido Microsoft últimamente de llamarle «Service Pack» a cosas que realmente son casi nuevas versiones completas del producto, con nuevas tencologías incluidas. A este ritmo van a sacar la nueva versión de Visual Studio y la gente aún estará empezando a ponerse bien al día con VS2005 🙁


En fin, valor y al toro 🙂

Windows Media Player: Solucionar los problemas de canciones entrecortadas y tiempos de inicio eternos en Vista

¿Has experimentado problemas al reproducir audio con Windows Vista? Por ejemplo: cuando cambias de canción o comienzas a reproducir una, tarda varios segundos en empezar mientras pone «Cambiando medio». O por ejemplo: justo antes de terminar una canción (en el 90% más o menos) de repente durante un par de segundos la canción se oye entrecortada.


Bueno, esto es lo que me pasaba a mi hasta hace poco. El motivo es, por lo visto, que mi tarjeta de sonido no es la bomba precisamente (es un portatil orientado a empresa) y sus controladores no son totalmente compatibles con la nueva pila de sonido de Windows Vista. Al parecer es un problema común según he podido constatar hablando con algunos amiguetes.


Resulta que Vista incluye una nueva pila de procesamiento de sonido que nos permite obtener por software algunas características interesantes, y en concreto unas cuantas mejoras de sonido. Puedes verlas yendo a Panel de Control·Sonido y viendo las propiedades de los altavoces:



Si te interesa conocer todos los detalles técnicos del nuevo sistema de sonido de Vista y cómo sacarle partido a todo ello, incluso desde tus propios programas, puedes echarle un vistazo a esta página en Microsoft. Hará las delicias de los más frikis.


Para el resto de los mortales, entre los que me incluyo, que a duras penas sabemos para qué diablos valen estos cuatro ajustes que se ven en la figura de arriba, lo mejor es desactivarlo todo.


Esas mejoras no se llevan bien con algunos sistemas de sonido como el de mi portatil. Incluso aunque no tengas inguna de ellas activada, mientras no marques la opción «Desactivar todos los elementos» esta característica seguirá influyendo en tu sonido puesto que aunque no haga nada el sonido se pasa por este nivel de la pila antes de salir por los altavoces.


Si estás sufriendo los problemas que describo al principio del post simplemente marca la casilla como muestro en la figura para desactivar esta parte de la pila del sistema de sonido. A partir de ese momento verás cómo tus canciones empiezan a reproducirse al instante y no se vuelven a entrecortar jamás 🙂


Espero que le sirva a alguien…

SQL Server Compact 2008 SP1 Referencia Completa

SQL Server dispone de una versión embebida que es tan interesante como desconocida y poco utilizada. Se trata de SQL Server Compact Edition. La mayor parte de la gente la desecha como opción porque la asocia con crear aplicaciones para dispositivos móviles (como PDAs o teléfonos), pero lo cierto es que tiene una cantidad espectacular de aplicaciones en entornos de escritorio.


Para empezar esta versión ligera de SQL Server es gratuita y compatible con su hermano mayor, con multitud de características avanzadas como SGBD. No necesita tener instalado un servicio permanentemente en ejecución en el sistema y es extremadamente ligera (tanto que puedes usarla en un teléfono, así que eso lo dice todo). Una de las características más interesantes es la de todas las opciones de sincronización que ofrece, que nos permiten replicar y mantener en sincronismo datos entre sistemas homogéneos, por lo que la hace ideal para aplicaciones que deban trabajar conectadas de forma no permanente y para almacenamiento local.


Se le puede sacar partido para multitud de casos. Por ejemplo, imagínate una aplicación de TPV (ventas por terminal) que se usa en una red de tiendas y que almacena sus datos en una base de datos central. ¿Qué pasa cuando falla la conexión a Internet? ¿Te vas a quedar sin poder facturar?. Obviamente no. Pues en este caso SQL Server Compact es un gran aliado ya que te permitiría implementar en tu TPV de manera sencilla una solución de almacenamiento local sin instalación compatible con SQL Server que funcionase cuando no hay conexión y que sincronizase de manera automática los datos cuando vuelva a haber conectividad.


Microsoft SQL Server Compact 2008 SP1: Referencia CompletaEn general cualquier situación que requiera un almacenamiento avanzado, incluso con simultaneidad de acceso por parte de varios usaurios, pero que no justifique el hecho de instalar un SQL Server completo es el lugar apropiado para usar SQL Server Compact.


Y la aparición del Service Pack 1 para este entorno con la inclusión de soporte para Entity Framework o posibilidad de usarla en entornos de 64 bits la hacen más potente todavía.


Total, que el hecho de que esta BD sea tan infrautilizada nos ha llevado a sacar desde Krasis Press un nuevo libro específicamente dedicado al tema (y el más grande que hemos hecho hasta el momento, con bastante más de 400 páginas). Su autor, José Miguel Torres, es un gran experto en este campo con muchos años de experiencia real en este tipo de aplicaciones de Smart Client comentados. Además el libro se ha concebido como una referencia completa que inluye todo lo que necesitas para dominar el entorno: desde su puesta en marcha y utilización, hasta su despliegue en entornos de producción, pasando por utilización, el lenguaje SQL, su acceso con ADO.NET 3.5, entornos de sincronización y todo tipo de conceptos sobre arquitectura de aplicaciones. Incluye por supuesto las novedades del SP1 aparecido esta misma semana. ¡Más fresco imposible! 🙂


Desde mi punto de vista un «must have» que todo programador de .NET debería conocer.


En la página del libro en Krasis Press tenéis toda la información, incluyendo un completo índice e introducción y el código fuente de ejemplo completo. Si lo compras te lo enviamos a casa por mensajero gratuitamente (dentro de la península) 🙂

Ya está disponible la versión definitva de SQL Server 2008

Desde ayer los suscriptores de MSDN y Technet ya puede descargarse la versión definitiva de SQL Server 2008.


Se trata de una gran noticia 🙂


Si eres suscriptor, ahí te dejo los enlaces:



Las versiones en otros idiomas distintos al inglés se irán colocando en las próximas semanas.

Cómo detectar su nuestra página dispone de un ScriptManager o no

Hay veces que necesitaremos usar programáticamente un ScriptManager dentro de una página, por ejemplo para añadir dinámicamente referencias a Scripts o a servicios Web o WCF. Para ello deberemos automatizar el control ScriptManager que toda página AJAX debe tener, pero ¿qué pasa si no existe ese control?


Para asegurarnos de que el control está añadido a la página y que podemos utilizarlo podemos emplear el método estático GetCurrent de la clase ScriptManager para verificar su existencia, así:


public static bool IsScriptManagerPresent(Page p)
{
ScriptManager Smgr = ScriptManager.GetCurrent(p);
return (Smgr != null);
}

Con esta sencilla función podremos averiguar si hay un Scriptmanager presente o no.


Es interesante notar que este método funciona y devuelve el valor correcto incluso cuando el ScriptManager no está presente en la página actual sino en la página plantilla (Master Page) que la contiene. No obstante es importante darse cuenta de que en ese caso devovlerá true incluso si la Master Page tiene un ScriptManager aunque no tengamos un ScriptManagerProxy (SMP) en la nuestra, por lo que si obtuviésemos una referencia al ScriptManager estaríamos trabajando directamente con el de la MP aún sin un SMP.