Moving to Microsoft Visual Studio 2010

Como algunos de vosotros ya sabéis, el lanzamiento de Visual Studio 2010 está al caer. Según Microsoft, esta nueva versión del producto incorpora cierta novedades que permitirán desarrollar más y mejor, aumentando significativamente la productividad.

En cualquier caso, siempre es recomendable tener algun libro de referencia que nos oriente sobre las novedades del producto. Por eso no quiero dejar pasar la oportunidad de presentaros el libro “Moving to Microsoft Visual Studio 2010, de Microsoft Press, que está disponible en una primera versión borrador, y lo más interesante, ¡es gratis!. Podéis descargaros los primeros capítulos del libro en formato XPS aquí.

El libro está enfocado a ayudar a migrar a la nueva tecnología a aquellos programadores que utilizan las versiones anteriores de Visual Studio (2003, 2005 y 2008). Para cada una de las versiones, se va a explicar las diferencias que existen en la parte de negocio y datos, diseño y presentación, y optimización y depuración de las aplicaciones.

Así que ahora ya no habrá excusas para utilizar la nueva versión de Visual Studio. Podéis encontrar la lista de novedades completa en este vínculo y en este otro.

¡Enjoy Visual Studio!

Tags: , ,

EnableEventValidation en GridView

Escribo rápidamente este post para explicaros un problema que me he encontrado hoy desarrollando una aplicación web ASP.NET 2.0 con AJAX. Resulta que tengo GridView que muestra una lista de ficheros, y donde al lado de cada uno de ellos aparece un icono para eliminarlos. Al hacer click sobre el icono, se debe eliminar el fichero asociado, y se debe volver a cargar el GridView con la lista actualizada.

Ficheros

Pues ejecutando la acción de borrado, me aparece el siguiente mensaje de error:

“Argumento de devolución o de devolución de llamadas no válido. La validación de eventos se habilita usando <pages enableEventValidation="true"/> en la configuración o <%@ Page EnableEventValidation="true" %> en una página. Por motivos de seguridad, esta característica comprueba que los argumentos pasados a eventos de devolución o de devolución de llamadas se origina desde el control del servidor que inicialmente los procesó. Si los datos son válidos y son los que se esperaba, utilice el método ClientScriptManager.RegisterForEventValidation para registrar los datos de devolución o de devolución de llamadas para su validación.”

Buscando en la web encontré múltiples soluciones, sin que ninguna sea suficientemente clara. De hecho, en muchos casos se comenta que la mejor opción es modificar la página o el fichero web.config y asignar el valor true al atributo enableEventValidation. Nada más lejos de la realidad…

El problema se produce porqué el GridView se intenta cargar de nuevo con los datos provenientes de la consulta en el evento Page_Load, sin contemplar la posibilidad de si se proviene o no de un PostBack. En definitiva, la solución consiste en cargar los datos del GridView sólo si es la primera vez que accedemos a la página:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
Handles Me.Load
If Not Page.IsPostBack Then
MostrarResultadoBusquedaFicheros()
End If
End Sub

Así que nos os compliquéis con soluciones difíciles si tenéis este problema con el GridView.
 
¡Espero que os sirva!

Tags: , , , ,

Microsoft DevLabs

Actualmente estoy finalizando un proyecto desarrollado con ASP.NET 2.0 y AJAX, en el que me he encontrado multitud de problemas, pero sobre todo, me ha ayudado a comprender la tecnología AJAX, como aplicarla y qué ventajas e inconvenientes presenta. De hecho, la aplicación empezó cubriendo unas necesidades, que a medida que avanzaba el proyecto, se fueron ampliando. En definitiva, la aplicación se ha convertido en un conjunto de páginas con algunos de los controles presentes en el AJAX Control Toolkit (conjunto de controles con funciones predefinidas y que ayudan a mejorar la usabilidad de las aplicaciones web), pero que se cargan demasiado lentamente.

Investigando un poco descubrí Doloto, o lo que es lo mismo, Download time optimizer for Web 2.0 applications. Doloto es una aplicación desarrollada por Microsoft que permite reducir el código de las aplicaciones que usan AJAX hasta un 40%, permitiendo que la página inicial de la aplicación se cargue entre un 30% y un 40% más rápido de lo que lo hace actualmente, y en definitiva, mejorando el rendimiento de la aplicación.

Doloto 

A partir de la web del producto (totalmente gratuïto), descubrí la página DevLabs de Microsoft, donde se presentan productos para mejorar los procesos de desarrollo de software basados en su tecnología. Además de Doloto presentan otros proyectos interesantes como Small Basic (un versión muy reducida de Visual Basic destinada a aquellos que quieran empezar a programar), o PEX (herramienta de automatización de pruebas).

¡Espero que os sirva!

Tags: , , , , ,

¿ASP.NET + AJAX o Silverlight 3?

Durante este mes de Agosto he estado desarrollando una nueva aplicación de gestión para llevar a cabo el mantenimiento de una flota de vehículos. Antes de empezar el desarrollo como tal estuve analizando las distintas tecnologías web con las que podía afrontar el proyecto.

Yo ya tenía experiencia en el desarollo con ASP.NET y AJAX, aunque la experiencia no ha sido del todo positiva, debido a los tiempos de respuesta en la renderización de las páginas y de los controles que ésta contiene (usé el AJAX Control Toolkit para ofrecer una buena experiencia de usuario), además de la velocidad de la red interna del cliente.

La alternativa a este entorno ha sido el uso de Silverlight 3, de reciente aparición, y con sustanciales mejores respecto a versiones anteriores. Mediante Silverlight creo que se puede ofrecer una buena experiencia de usuario, con unos de tiempo de respuesta fantásticos (obviamente, porqué la aplicación se ejecuta en el ordenador del cliente, y por este motivo debemos instalarnos previamente el plugin).

Ciertamente se ha vendido Silverlight como un buen entorno para desarrollar aplicaciones con un componente visual muy importante, pero sin tener en cuenta las aplicaciones de negocio (en Inglés, LOB o Line of Business applications). En este interesante artículo en inglés encontrareis una comparativa con las ventajas e inconvenientes que tiene esta plataforma.

En la red ya empiezan a circular las primeras aplicaciones de negocio basadas en Silverlight y que se pueden descargar libremente para analizarlas y comprobar todo su potencial (aunque las que os adjunto estén hechas con Silverlight 2).

¿Y que hay de la parte de acceso a datos? ¿Debemos utilizar Servicios Web como hasta el momento con las versiones anteriores? ¡Pues no! Gracias a .NET RIA Services podremos acceder a datos como si estuviesemos programando una aplicación ASP.NET clásica. En el siguiente post os explicaré de que va esto…

¡Espero que os sirva!

PD: Si alguien cree que me he equivocado al elegir la tecnología, o simplemente quiere comentar algo, por favor, ¡que no dude en decirlo!

Tags: , , ,

Multi-idioma... ¡Usando páginas maestras!

Después de escribir mi primer post de bienvenida, ahora ya me dispongo a entrar en materia, que es lo que realmente os puede interesar. Concretamente quiero empezar por un tema bastante interesante y aún poco resuelto como es la realización de sitios multi-idioma usando páginas maestras.

El orígen

Una de las características más imporantes de ASP.NET es la posibilidad de usar las funcionalidades de Globalización y Localización, o lo que es lo mismo, conocer el idioma con el que está trabajando el usuario para mostrar los literales correctos, así como las fechas y los números en los formatos apropiados. Toda la información relativa a su uso la podéis encontrar en este artículo de MSDN.

El problema

En muchos casos no se tiene en cuenta que la selección del idioma se debe realizar desde una página maestra, y no desde una página básica. Tal y como se muestra en este artículo , en una página básica únicamente se trata de sobrecargar el método InitializeCulture, y establecer el valor de CurrentCulture (formatos númericos y de fechas) y CurrentUICulture (fichero de recursos a utilizar) del thread actual (System.Thread.CurrentThread).

Sin embargo, este método no es aplicable cuando estamos usando páginas maestras, debido a que éstas no pueden sobrecargar el método InitializeCulture (porqué no heredan de System.Web.UI.Page, si no que heredan de System.Web.UI.MasterPage). Algunas personas intentan sobrecargar el método InitializeCulture tal y como se muestran en los ejemplos comentados, pero no les funciona correctamente porqué se ejecuta antes el método InitializeCulture que el método de selección del nuevo idioma en la página maestra (por ejemplo, si tenemos un DropDownList con varios idiomas, el evento a controlar será el SelectedIndexChanged, y allí se guardará el nuevo idioma seleccionado en una cookie o en una variable de sesión, por ejemplo).

La solución

Únicamente se trata de intentar recuperar el valor del idioma seleccionado mediante el propio control, y no con el uso de cookies o variables de sesión. El método es muy similar al usado en las páginas básicas, ya que en todas ellas debermos sobrecargar el método InitializeCulture, pero en lugar de consultar el valor de la cookie o variable de sesión, consultaremos el valor del control directamente. ¿Como? Pues conociendo el nombre del control en el lado del cliente (nombre del control en el fichero HTML generado), y recuperando su valor mediante el acceso a la colección de valores del formulario (Request.Form). Cómo una imágen vale más que mil palabras, allá vamos... (pasos a seguir):

1) Crear una página maestra, donde incluimos, por ejemplo, un dropdownlist para seleccionar distintos idiomas:

 <asp:DropDownList ID="cmbIdiomas" runat="server" Width="199px">
 <asp:ListItem Value="en-GB">English</asp:ListItem>
        <asp:ListItem Value="es-ES">Español</asp:ListItem>
        <asp:ListItem Value="fr-FR">Français</asp:ListItem>
</asp:DropDownList>

2) Creamos una página básica que use la página maestra anterior, y ejecutamos la aplicación. ¿Porqué? Queremos ver qué nombre tendrá el control dropdownlist (cmdIdiomas) en el lado del cliente (HTML). Así que cuando ya está ejecutada la aplicación, visualizamos el código fuente generado y buscamos el nombre del control:

Podemos ver como el nombre que tiene el control es ctl00$cmbIdiomas.

3) Ahora se trata de recuperar el valor que tiene el control en el método InitializeCulture en la página básica, con un código similar a este:

Protected Overrides Sub InitializeCulture()
        If Not Request.Form("ctl00$cmbLanguage") Is Nothing Then
            System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo(Request.Form("ctl00$cmbIdiomas"))
            System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo(Request.Form("ctl00$cmbIdiomas"))
        End If
End Sub

De esta manera la página se establecerá en el idioma seleccionado en el dropdownlist, y actuará como si el selector de idioma se encontrara en la misma página y no en una página maestra. 

Conclusión

Cuando me enfrenté al problema comentado, me di cuenta de que es ciertamente importante conocer el orden de ejecución de los distintos eventos en una página ASP.NET. Comprendiendo este orden es más fácil encontrar soluciones a los problemas que nos enfrentamos a diario. La documentación relativa a estos eventos, y en definitva, al ciclo de vida de una página ASP.NET se encuentra en este artículo.

Espero que les haya sido de ayuda...

 

Tags: , , , ,