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.
36 Responsesso far
El Sys ese es un borde… no hace más que quejarse y hablar por telefono xddddddd
Thx por el articulo maeztro
Hola Jorge:
Por eso están esas maravillosas plantillas que nos ahorran tener que escribir y configurar 😉 aunque yo tengo un web.config preparado para añadirlo a cualquier aplicación y listo
Salu2
Sencillamente GRACIAS !!!!!!!!!! Me he vuelto loco con una aplicación web k no funcionaba con el maldito sys…. Y gracias al gurú Emilio (velardiez), todo un crack como tú….de nuevo, gracias a los dos !!!
Hola Frank,
me alegro mucho de que te sirviera.
De hecho, con esa idea lo publiqué. 🙂
Muchas gracias por compartirlo.
Hola Jorge, implemente tu solucion y se corrigio el problema del sys (Gracias), pero en mi proyecto simplemente no funciona el Ajax, sigue enviando toda la pagina ya con los controles puestos en el updatePanel y pues nada cambia, ¿Tienes alguna pista de que me pueda estar faltando?
Hola Miguel,
no basta con poner un UpdatePanel y los controles en él. Nos faltaría una cosa más.
Aquí va un ejemplo muy simple:
Metes un UpdatePanel en el WebForm.
Dentro del UpdatePanel un control Label.
Dentro del WebForm y fuera del UpdatePanel un control Button.
Haces doble clic sobre el control Button y escribes el siguiente código al evento Click:
Label1.Text = Date.Now()
Ejecutas (F5) la aplicación y observamos el comportamiento que indicas.
Volvemos al diseño de la aplicación.
Hacemos clic sobre el control UpdatePanel y en las propiedades hacemos clic sobre la opción Triggers.
Agregamos un AsyncPostBackTrigger, y asociamos éste al control ControlID (Button1) y con EventName (Click).
Ejecutamos (F5) nuestro ejemplo nuevamente, y el comportamiento debería haber cambiado automáticamente. 🙂
Espero que te sirva,
un saludo.
Estimado Jorge
Evidentemente hay otras opciones por las que da el famoso «‘Sys’ no está definido», ya que tengo una aplicación web, creada con la plantilla de Ajax y a pesar de pisar el web.config con uno de otro sitio que si funciona (en la misma máquina de desarrollo), y que a pesar de todo sigue con el mismo error.
Tienes idea que otra cosa puede generar ese error?
Saludos
Hola.. tengo un problema con los famosos update
panel..
es el sgt:
Tengo un datagrid y un dropdown el data
la grilla depende del drop…
lo q pasa q cuando uso el drop.. parpadea el datagrid…
hola jorge podrias publicar oi recomendar alguna URL para iniciar fuertemente con Ajax y Silverlight?
Jorge eres un maestro. Muchas gracias.
Hola espero que aqui haya alguien que me pueda orientar sobre lo que me esta pasando que acontinuacion les explico:
tengo un website de vb.net 2005 que contiene unas graficas de Dundas Chart for asp.net y un grid para mostrar los datos tanto tabulares como graficos y un boton para exportar estos datos a excel, ahora el detalle esta que el boton no funciona es decir apenas le doy click me aparece un mensaje de error dice que no encuentra una serie de datos de la grafica pero que realmente si existen lo raro es que no importa que boton inserte o de que tipo ya que me marca el mismo error inclusive si solo quiero enviar un mensaje al dar click sobre el boton.
esto sucede con o sin el updatepanel la diferencia es que el boton dentro del updatepanel envia el error como un mensaje de advertencia y fuera de el marca el error sobre toda la pagina(agrege al archivo web.config los tags que me faltaban de ajax para que no me marcara el error del ‘sys no definido’) ahora algo todavia mas raro es que tengo varias graficas exactamente igual y en las demas no me marca ningun error.
por si esto fuera poco al momento de pasar al servidor mi website marca error en todo a menos que le ponga el scriptmanager y un updatepanel y me marca el siguiente error en el boton de exportar a excel: Sys.WEbForms.PageRequestManagerServerErrorException: an unknowm error ocurred while proccessing the request on
the server The status code returned from the server was:500
llevo una semana con esto y ya es demasiado por favor alguien ayudeme se lo agradecere!!!
saludos!!!
Holaaaa!! que buen articulo… escribiste todos los pasos que yo tambien hice para solucionar este error.
Pero ahora me encuentro con el mismo error pero digamos que en otro contexto!!!!
esta solucion funciona bien en un WebSite,
pero ahora tube el mismo problema en un WebApplicationProject y no funciona!!!
alguien tiene idea de que pasa???
holaaaa, yo sigo con el problema mentado sys, no me deja en paz, ya puse el condigo en el web.config como dicen y sigue apareciendo agradecería su ayuda.
cieriurquiz@gmail.com
Yo también tengo la frustración de tener «Sys no está definido» en mi página Web.
Mi caso es muy extraña (creo):
1) el sitio está en http://www.solicon.com.es/lomas21
2) AJAX funciona muy bien en este sitio (sin errores)
3) tengo también un nombre de dominio (sin espacio ni nada) se llama http://www.lomas21.es
4) el usuario que entra en este dominio va automaticamente a http://www.solicon.com.es/lomas21 pero con el nombre http://www.lomas21.es en el navigador
5) pero………….. ahora NO FUNCIONA Ajax
y le da este Sys error…..
¿Quien me pueda ayudar?
André
Mi correo: andre-teunissen@solicon.es
Señor, excelente solucion. Justo fue el problema que tuve. La desventaja es que yo ya habia generado el proyecto y ya iba avanzado, asi que lo que hice fue quitar de la solucion el proyecto, crear un nuevo proyecto «ajax enabled» en el mismo lugar que el anterior, y me pidio substituir default.asp, default.asp.cs y web.config, por lo que SOLO sustitui web.config, despues volvi a colocar las variables que habia estado usando ( ya en el nuevo config) y corrio de maravilla. Cabe mencionar antes de descubrir esto, quice hacer un «copy-paste» del web config de un ajax enabled a mi sitio, y no funciono (por si a alguien se le ocurre la grandiosa idea). Gracias por tu aportacion! Jorge!
arturo.vizcaino@gmail.com
Buenas, la verdad qeu todo muy lindo, pero, je, el problema que estoy teniendo es exactamente ese del ‘sys’ no esta definido pero no de manera local, sino que ocurre cuando subo la aplicación al servidor, que me podría estar faltando. Desde ya, Muchas Gracias….
Esto a lo mejor los ayuda.
http://daniel-vargas.blogspot.com/2007/03/como-evitar-sys-no-esta-definido.html
Aunque la tecnología Ajax ya lleva mucho tiempo activa en el mundo web, yo personalmente no me había
Aunque la tecnología Ajax ya lleva mucho tiempo activa en el mundo web, yo personalmente no me había
otro causante podrian ser los caracteres <>, basta con quitar la proteccion del validate request solo agreguen esta fracesita al page languaje ValidateRequest=»false» y hagan una funcioncita que la haga de ValidateRequest ya que esto sirve para evitar inyeccion de SQL… Saludos
Esto es lo que encontre ojala les ayude okas saludos y exitos xD
De forma predeterminada, cuando AJAX está habilitado para una página, ASP.NET inserta una llamada al método initialize justo delante de la etiqueta de cierre en la página. Todo el código que aparezca detrás de la etiqueta no se inicializará como parte de la aplicación y no tendrá acceso a la funcionalidad AJAX de ASP.NET.
El método initialize permite que la clase Sys.Application se inicialice. La inicialización de la aplicación sólo se produce una vez en el ciclo de vida de la página. Todas las llamadas a initialize que se realizan posteriormente sólo llaman al método raiseLoad.
Cuando se inicializa por primera vez la aplicación (después de la primera solicitud GET), se producen los siguientes procesos:
Una vez cargados todos los scripts, se inicia el modelo de creación de objetos.
Si es necesario, los componentes ejecutan la lógica para obtener referencias complejas a otros componentes.
Las llamadas al método $create se realizan en los controladores de eventos init.
El modelo de creación de objetos finaliza.
Se provoca el evento load.
Una vez inicializado el objeto Application, se ejecutan inmediatamente los controladores siguientes asociados al evento init.
Hola a Todos!!!
Excelente explicación a un problema que generalmente sucede cuando no sabemos para que sirve el webconfig(como yo), asi que nunca está de mas una explicación para esto.
Pero además comento a todos aquellos que aún tienen pesadillas con Sys, recordarles que Es necesario además agregar la dll System.Web.Extension.dll a la carpeta bin de su Proyecto. yo lo hice he hice y no he tenido hasta el momento ningún problema con el …. como se llamaba? ahhhh Sys. jeje(no saben cuantos dolores de cabeza tuve con ese error).
Uuuuuuuuuuuuuuuuuu!!!! 3 dias investigando y aqui estuvo la solucion Gracias. Genere un proyecto ASP.NET Ajax y copie las lineas del web.config que no tenia el web.config de mi proyecto y funciono.
Bien por por ustedes maestros.
A mi me sigue sin ir…
Dónde está la dll system.web.extension.dll? esque no la encuentro… es desesperante el error de sys xD
Muy Bueno , gracias por los aportes a todos
German Vera
Cuando todo falle: La raíz del proyecto tiene que tener permisos de ejecución (en el IIS)
Recuerden que las extensiones de Ajax deben estar instaladas en el servidor web, sea de producción o de desarrollo. Esto es adicional al Framework .NET
Una consulta.. recien empiezo ah utilizar el asp.net ajax 1.0 .. y kiero acer una galeria de fotos utilizando el animationExtender.. weno el codigo too bien.. pro cuando voy ah diseño me sale error diciendo q me falta registrar el tagPrefix en el formulario webs froms.. me podrias ayudar con como registrarlo.. o una ayuda general para q no volviera ah salir eso en otros forms.. creo c modifika en el web.config.. o no ¿?.. me podrias ayudar con el codigo.. seria d mucha utilidad.. Espero tu respuesta..!!
Ahh se ve muy interesante el ASP.NET AJAX ..
Estimados,
No es necesario hacer una copia de todo el WEB.CONFIG, sino que solamente incorporar los siguientes atributos en el web.config.
saludos.
¡Fenomenal, Jorge! ¡me ha venido al dedillo tu artículo!
Salu2,
cuando realizo el postback se borra las cajas de texto las cuales estan asociados extensores ajax, te dejo mi correo chuquipoma@hotmail.com
Muy bueno, y manera peculiar de contarlo nunca esta de menos echarte unas risas en algún foro después de tantas horas delante del pc carcomiendote sin solución alguna
te felicito pude arreglarlo con tu web config
Gracias por tu solución, no sabía que más hacer.
Se agradece.
Despues de batallar encontre la respuesta, muchas gracias.