Hola Mundo con ASP.NET AJAX 1.0, primeros problemas y soluciones
El otro día, me puse a hacer un pequeño y simple ejemplo con ASP.NET AJAX 1.0, el típico ejemplo Hola Mundo, nada especial, pero había usado otros controles de AJAX de otros fabricantes y los ejemplos de ASP.NET AJAX que había visto, estaban hechos y sinceramente, tampoco me he pegado mucho con ellos.
Para ello, instalé previamente las extensiones de ASP.NET AJAX 1.0 para Visual Studio 2005.
Instalación correcta y todo funcionando perfectamente (lo normal y esperado vamos).
Inicié Visual Studio 2005 y seleccioné la creación de un nuevo Sitio Web (por aquello de hacer algo).
Dentro de las plantillas que aparecen, me fijé en la plantilla ASP.NET AJAX-Enabled Web Site, una plantilla que contiene la base de creación de una aplicación con ASP.NET AJAX. Pero demasiado fácil pensé,... así que como yo soy así, decidí crear el proyecto como Sitio Web ASP.NET y a partir de ahí meter los controles ASP.NET AJAX que necesitara. Vamos,... iniciar un proyecto en blanco como lo haría creo yo el 99% de los seres humanos que van a iniciar un proyecto ASP.NET...
Así que inicié mi flamante proyecto vacío, inserté en mi formulario Web un control Button, un control ScriptManager y un control UpdatePanel. Dentro del control UpdatePanel un control Label,... y algo de código por supuesto. Un poquito de todo, pero nada del otro mundo.
Ya estoy listo para probar mi primer ejemplo de ASP.NET AJAX 1.0... así que F5 al canto para ejecutarlo y ver que tal... total... es un pequeño ejemplo pero que debería funcionar como un torpedo.
Pero... ¡zás!... error de script en la página... mmmm... analizo el error y observo que hay dos errores en dos sitios diferentes del script de la página Web que dicen: "'Sys' no está definido".
Miro el código fuente generado en la página Web y veo más allá que tengo estas instrucciones con el Sys delante:
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tUpdatePanel1'], ['Button1'], [], 90);
Sys.Application.initialize();
Vaya... esto se complica... porque juraría que no es Sys, sino System... pero a lo mejor es Sys... sea lo que sea, este error es muy raro..., un sudor frío y porque no decirlo,... el miedo, se apodera de mi ser por un momento, pero claro... tengo otra alternativa para probar si realmente es un error catastrófico o si es algo que no he tenido en cuenta... mi Hola Mundo no hace gran cosa, pero igual se me ha pasado algo... así que iniciaré un nuevo proyecto usando esta vez la plantilla ASP.NET AJAX-Enabled Web Site.
Así que raudo y veloz me tiro en plancha a por esa plantillita, repito mi pequeño ejemplo, pulso F5 y ¡zás!, ¡funciona!.
A ver... tiempo muerto como hacen en un partido de baloncesto. Vamos a analizar la situación. He seguido los mismos pasos, en un sitio da error y en el otro funciona... la diferencia es que en uno no he usado la plantilla de ASP.NET AJAX y en el otro sí... bueno, pues a analizar el código.
Lo primero que observo es que el script es correcto, el famoso Sys es así. Está bien escrito. Bien, descartamos eso.
Lo segundo que observo es que el código de toda la aplicación es el mismo y funciona. Bien, descartamos que tengo zarpas en lugar de manos.
Sigo mirando mi aplicación, y como uno ya tiene experiencia en las peleas con .NET, piensa... ¡ese web.config me está mirando con desconfianza!.
¡Je!, vamos a analizar el web.config.
Lo primero que detecto es que el web.config de la plantilla de AJAX tiene más información que el web.config del Sitio Web por defecto.
La primera acción a acometer es copiar y sobreescribir el web.config del sitio con la plantilla de AJAX en el Sitio Web por defecto. Ejecutamos nuestro Sitio Web (el que daba el error de script), y ahora vemos que funciona perfectamente.
Dentro del web.config, observamos que hay un montón de instrucciones que no lleva el web.config de un Sitio Web por defecto.
Estas instrucciones son las siguientes:
<?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/> <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="Everywhere"/> <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" allowDefinition="MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> <system.web> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </controls> </pages> <compilation debug="true"> <assemblies> <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </assemblies> </compilation> <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/> </httpHandlers> <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules> </system.web> <system.web.extensions> <scripting> <webServices> </webServices> </scripting> </system.web.extensions> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </modules> <handlers> <remove name="WebServiceHandlerFactory-Integrated"/> <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </handlers> </system.webServer> </configuration> |
ASP.NET AJAX 1.0 son unas clases para .NET que van un poco a su bola para entendernos. Si en una página Web inserto un control ASP.NET AJAX, debería funcionar con AJAX a no ser que utilizará alguna configuración especial de generación o gestión de AJAX. Para hacer justamente eso, ASP.NET AJAX utiliza el web.config.
Así que si te encuentras con que recibes un error en tu página Web que dice "'Sys' no está definido", acuérdate de esto que te he indicado aquí para resolver el posible problema.