I was working on a project and just on a whim decided to try out some of .NET’s AJAX controls. I chose a random page, added a ScriptManager, tossed in a TextBox and a CalendarExtender.
F5. Page shows up. Javascript error:
Line: 121 Char: 1 Error: 'Sys' is undefined Code: 0 Url: http://localhost:49329/admin.aspx
Hmm.
Try a new project. Add a ScriptManager, tossed in a TextBox and a CalendarExtender. Works fine. Huh?
I go through the Web.Config files of the two. Nothings changed except the version number on everything:
non working: Version=3.5.0.0 working: Version=1.0.61025.0
Ah ha! That must be it. I reset the working project as a 3.5 app and run it. I was so sure it was going to fail. Nope. Worked fine.
Must be something else. *grumble*
I start taking pieces out of my existing app and when I came to the Global.asax I took out the RouteTables and AJAX comes to life! FINALLY!
Here is what I had:
Global.asax
protected void Application_Start(object sender, EventArgs e) { // Code that runs on application startup RegisterRoutes(RouteTable.Routes); } private static void RegisterRoutes(ICollection<RouteBase> Routes) { RouteTable.Routes.Add( new Route("{Parameter}/{pageID}", new RouteHandler())); RouteTable.Routes.Add( new Route("{Parameter}", new RouteHandler())); }
With my routing handler file showing this little gem:
RouteHandler.cs
string virtualPath = string.Format("~/{0}.aspx", pageName); return (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page));
So basically it was swiping the file extensions from my httpHandlers and replacing them with .aspx meaning they were not found.
Web.Config
<httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpHandlers>
To handle the situation I added the following to Global.asax:
Global.asax
protected void Application_Start(object sender, EventArgs e) { // Code that runs on application startup RegisterRoutes(RouteTable.Routes); } private static void RegisterRoutes(ICollection<RouteBase> Routes) { RouteTable.Routes.Add(new System.Web.Routing.Route("{resource}.axd/{*pathInfo}", new System.Web.Routing.StopRoutingHandler())); RouteTable.Routes.Add(new System.Web.Routing.Route("{service}.asmx/{*path}", new System.Web.Routing.StopRoutingHandler())); RouteTable.Routes.Add( new Route("{Parameter}/{pageID}", new RouteHandler())); RouteTable.Routes.Add( new Route("{Parameter}", new RouteHandler())); }
I hope this helps. 🙂