Gerardo Contijoch

Experiencias del día a día trabajando con .NET – ASP.NET, C#, ASP.NET MVC y demas…

Posts Tagged ‘asp.net-ajax’

Mis problemas con ASP.NET AJAX

Posted by Gerardo Contijoch en abril 5, 2009

Mi relación con ASP.NET AJAX nunca fue buena. Siempre tuve muchos problemas con la implementación de AJAX de Microsoft. Nunca me gustó usarla, me da la impresión de que es muy pesada y hay que saber demasiado para usarla (los problemas de éste y éste post son un ejemplo de ello). Por cuestiones de trabajo, hace unos meses me vi obligado a usarla y todavía me sigo encontrando con problemas de no muy obvia solución.

Recuerdo cuando usé AJAX por primera vez. Fue con Ajax.NET Professional. Tenia que manejar todo con javascript y no había controles ni nada de eso, el HTML se generaba en el servidor y se enviaba como respuesta al request. Por supuesto que esto no tiene porque ser así necesariamente, se puede generar el HTML en el cliente, pero aún así era mas sencillo de usar. Uno tenia que ensuciarse un poco mas las manos con javascript, pero por lo menos uno tenia control sobre lo que hacía. No me pasa lo mismo con ASP.NET AJAX, no se que es lo que pasa por detrás, no se cuando puede fallar ni donde, el framework inyecta scripts por todos lados… no me termina de convencer. Ojo, no quiero decir que Ajax Pro sea mejor que ASP.NET AJAX, simplemente digo que la solución de Microsoft no me da la seguridad que busco.

Por ejemplo, el caso que mencioné en este post. El error que obtenía era básicamente ‘no se puede cargar el archivo xxxx.js’. Resulta que para cargar un archivo de scripts correctamente (dadas ciertas condiciones, no ocurre siempre) tengo que modificarlo de modo que el mismo notifique que su carga ha finalizado. No es algo muy intuitivo que digamos… Uno puede buscar en muchos lados la respuesta hasta encontrarla.

Otro de los problemas que tengo es el uso de los UpdatePanels. Si no se saben usar, pueden resultar muy peligrosos. Éste post muestra un ejemplo de ello. Creo que una de las características más peligrosas de los UpdatePanels es justamente su facilidad de uso. Da la impresión de que al arrastrar el control a una pagina se nos solucionan muchos problemas, pero podemos estar trayendo muchos mas. Para evitarlo, hay que entender como funcionan y saber como hacerlos funcionar como queremos, pero lamentablemente no es mucha la gente que se toma el trabajo (o tiene tiempo) de leer sobre el funcionamiento interno de los controles y por ello muchas veces son más un problema que una solución.

No se… no me termina de convencer todo esto, supongo que será hasta que me acostumbre…

¿A alguien le sucede lo mismo?

¡Nos vemos en el próximo post!

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Posted in ASP.NET, Desarrollo Web | Etiquetado: , , | 4 Comments »

Sys.WebForms.PageRequestManagerParserErrorException al hacer un postback parcial

Posted by Gerardo Contijoch en diciembre 26, 2008

Hace unos días me encontré con otro problema bastante molesto en ASP.NET AJAX al cual no le encontré solución. Se presenta cuando se hace un postback parcial y se muestra un error como el siguiente:

Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled.

Details: Error parsing near ‘<!DOCTYPE html P’.

(Noten que el nodo <!DOCTYPE> parece estar truncado en la respuesta)

Luego de buscar un rato, me encontré con este post de Eilon Lipton (¡el creador de este error!) donde explica porque sucede y como se puede evitar.

Cuando uno hace un postback parcial la respuesta viene en un formato especial el cual es interpretado por los scripts del lado del cliente de ASP.NET AJAX. Si nosotros durante el procesamiento del postback modificamos la respuesta, entonces los scripts van a ser incapaces de procesarla, produciendo este mensaje de error.

Para evitarlo hay que tener presente los siguientes puntos:

Nunca ejecutar Response.Write(“…”); durante un postback asincrónico.

Esto se debe a que al escribir directamente sobre la respuesta, estamos modificándola sin que los objetos encargados de procesarla lo sepan y por lo tanto, no pueden prever esos cambios.

Uso de filtros de las respuestas y HttpModules.

Al igual que con el punto anterior, si modificamos la respuesta de alguna manera, vamos a estar provocando este error seguro.

No habilitar el Trace.

Cuando uno habilita el trace en las paginas, básicamente lo que se esta haciendo es una serie de Response.Write(“…”); con la información de tracing.

Llamadas a Server.Transfer();

Cuando uno ejecuta Server.Transfer(), la respuesta deja de ser la respuesta que espera el objeto que provoca el postback asincrónico y pasa a ser el HTML generado por la página a la cual hicimos el transfer. Obviamente, esto va a interferir con el procesamiento de la respuesta (¡ya que la esta sería una pagina completa totalmente diferente a la respuesta esperada!).

En mi caso particular, no estaba haciendo nada de lo mencionado arriba, sino que estaba agregando una cookie a la respuesta, lo cual evidentemente la modifica, así que podemos agregar a la lista:

No agregar cookies a la respuesta de un postback asincrónico.

Al agregar las cookies a la respuesta, la estamos modificando (ya que enviamos la información de la cookie), por lo que hay que evitar hacerlo.

Entonces, ¿cómo se soluciona el problema cuando no podemos dejar de usar cookies o HttpModules? La solución que encontré yo fue muy simple: reescribí la página en cuestión y saque todo lo referente a ASP.NET AJAX. Todo funcionó de maravillas con un postback clásico.

¡Nos vemos en el próximo post!

PD: Si realmente necesitan modificar la respuesta en una llamada parcial, este post puede serles utiles, yo no lo probe, pero parece que funciona…

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Posted in ASP.NET, Desarrollo Web | Etiquetado: , , | 3 Comments »

Sys.ScriptLoadFailedException al intentar cargar un script dinámicamente con ScriptManager

Posted by Gerardo Contijoch en diciembre 16, 2008

Hoy estaba trabajando en un site que usa ASP.NET AJAX y me encontré con el siguiente error:

Sys.ScriptLoadFailedException: The script ‘http://localhost:49573/scripts/Script.js&#8217; could not be loaded.

Ese es un script que yo cargo dinámicamente mediante el ScriptManager de la siguiente manera:

ScriptManager.RegisterClientScriptInclude(pagina, typeof(Page), "miScript", "scripts/Script.js");

Busqué códigos de ejemplos en internet y todos eran iguales al mío, no encontraba el error hasta que me topé con este post de Bill Robertson.

Resulta que ASP.NET AJAX carga los scritps registrados de esta manera de forma asincrónica y es necesario notificar la finalización de la carga de cada script para que todo funcione como debería. Para realizar la notificación simplemente hay que agregar el siguiente código al final del archivo js al que hagamos referencia:

   1: if(typeof(Sys) != "undefined" && typeof(Sys.Application) != "undefined") {
   2:    Sys.Application.notifyScriptLoaded();
   3: }

La validación de la línea 1 no es necesaria en realidad, pero si usamos este archivo en un site donde no se usa ASP.NET AJAX, la línea 2 va a fallar (debido a que puede no existir el objeto Sys).

Una vez hecho eso, el site comenzó a funcionar como siempre y el script se cargó correctamente.

¡Nos vemos en el próximo post!

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Posted in ASP.NET, Desarrollo Web, Javascript | Etiquetado: , , , | 2 Comments »