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: , , , , ,

Ejecución de paquetes de Integration Services desde una aplicación .NET

Hace unos días estuve realizando una formación sobre SQL Server 2005 Integration Services, o lo que es lo mismo, la nueva herramienta de desarrollo de los antiguos DTS (Data Transformation Services) de SQL Server 2000. Mediante esta herramienta se pueden crear de forma fàcil y rápida soluciones de transformación de datos, que pueden llegar una complejidad importante, pero que pueden ayudar, y mucho, a la automatización de tareas de mantenimiento de datos (no deja de ser una herramienta ETL: Extract, Transform, Load). Mediante Visual Studio 2005 o 2008 es posible desarrollar una solución de Integration Services, para después probarla antes de subirla a un entorno de producción. Cuando la solución es correcta, se puede programar para que se ejecute con cierta periodicidad, o bien se puede ejecutar manualmente.

El objetivo de este post no es más presentar una posible solución para ejecutar una paquete de Integration Services desde una aplicación .NET (Windows), de forma que la ejecución del paquete se puede llevar a cabo desde una aplicación externa (y no desde el propio SQL Server). Los pasos a seguir serían los siguientes:

1) Añadir una referencia a la librería Microsoft.SqlServer.ManagedDTS:

2) Añadir el siguiente bloque de código (Visual Basic .NET) en cualquier evento (el click de un botón, por ejemplo):

   1: Dim appDTS As New Microsoft.SqlServer.Dts.Runtime.Application
   2: Dim paquete As Microsoft.SqlServer.Dts.Runtime.Package
   3: Dim resultado As Microsoft.SqlServer.Dts.Runtime.DTSExecResult
   4: paquete = appDTS.LoadFromSqlServer("AgregadoVentas", "ferran-2a90840e", String.Empty, String.Empty, Nothing)
   5: resultado = paquete.Execute()MessageBox.Show(resultado.ToString)

En este caso, llamamos a un paquete llamado AgregadoVentas, que se encuentra almacenado en el servidor de SQL Server ferran-2a90840. De esta forma tan simple podremos llamar a cualquier paquete almacenado, provocando su ejecución de forma instantánea. Finalmente, se mostrará por pantalla el resultado de la ejecución del paquete.

Así mismo, cabe indicar que en este caso estamos cargando un paquete almacenado en el servidor de SQL Server, y por este motivo utilizamos el método LoadFromSqlServer, perteneciente a la clase Dts.Runtime.Application. Si quisiéramos cargar un paquete almacenado en el sistema de ficheros, deberíamos utilizar el método LoadPackage.

¡Espero que os sirva!

Tags: , , ,