/// <summary> /// This was copied from System.Web.Mvc.RouteCollectionExtensions and /// modified slightly. The original function declares the defaults /// and constraints parameters as object type, which causes the wrong /// overload of RouteValueDictionary to be invoked, causing values in /// the dictionaries not to be set properly. The modified version /// declares these parameters as Dictionary<string, object>, /// fixing the problem. /// </summary> /// <param name="routes"></param> /// <param name="name"></param> /// <param name="url"></param> /// <param name="defaults"></param> /// <param name="constraints"></param> /// <param name="namespaces"></param> /// <returns></returns> private static Route MapRoute(RouteCollection routes, string name, string url, Dictionary<string, object> defaults, Dictionary<string, object> constraints, string[] namespaces) { if (routes == null) { throw new ArgumentNullException("routes"); } if (url == null) { throw new ArgumentNullException("url"); } if (constraints == null) { throw new ArgumentNullException("constraints"); } Route route = new Route(url, new MvcRouteHandler()) { Defaults = new RouteValueDictionary(defaults), Constraints = new RouteValueDictionary(constraints) }; route.DataTokens = new RouteValueDictionary(); if (!String.IsNullOrEmpty(name)) { route.SetRouteName(name); } if ((namespaces != null) && (namespaces.Length > 0)) { route.DataTokens["Namespaces"] = namespaces; } routes.Add(name, route); return route; }