private Route BuildDirectRoute( string routeTemplate, IRouteInfoProvider routeInfoProvider, ControllerDescriptor controllerDescriptor, IEnumerable <ActionDescriptor> actionDescriptors, bool isActionDirectRoute) { if (routeTemplate == null) { throw Error.ArgumentNull("routeTemplate"); } if (routeInfoProvider == null) { throw Error.ArgumentNull("routeInfoProvider"); } if (controllerDescriptor == null) { throw Error.ArgumentNull("controllerDescriptor"); } if (actionDescriptors == null || !actionDescriptors.Any()) { throw Error.ParameterCannotBeNullOrEmpty("actionDescriptors"); } string controllerName = controllerDescriptor.ControllerName; RouteAreaAttribute area = controllerDescriptor.GetAreaFrom(); string areaName = controllerDescriptor.GetAreaName(area); RouteValueDictionary defaults = new RouteValueDictionary { { "controller", controllerName } }; if (isActionDirectRoute) { ActionDescriptor actionDescriptor = actionDescriptors.Single(); defaults.Add("action", actionDescriptor.ActionName); } RouteValueDictionary constraints = new RouteValueDictionary(); string detokenizedRouteTemplate = InlineRouteTemplateParser.ParseRouteTemplate(routeTemplate, defaults, constraints, ConstraintResolver); ParsedRoute parsedRoute = RouteParser.Parse(detokenizedRouteTemplate); RouteValueDictionary dataTokens = new RouteValueDictionary(); dataTokens[RouteDataTokenKeys.DirectRoutePrecedence] = RouteEntry.GetPrecedence(parsedRoute, constraints); dataTokens[RouteDataTokenKeys.DirectRouteController] = controllerDescriptor; dataTokens[RouteDataTokenKeys.DirectRouteActions] = actionDescriptors; int order = 0; IOrderedRouteInfoProvider orderedAttribute = routeInfoProvider as IOrderedRouteInfoProvider; if (orderedAttribute != null) { order = orderedAttribute.Order; } dataTokens[RouteDataTokenKeys.DirectRouteOrder] = order; if (areaName != null) { dataTokens.Add(RouteDataTokenKeys.Area, areaName); dataTokens.Add(RouteDataTokenKeys.UseNamespaceFallback, value: false); Type controllerType = controllerDescriptor.ControllerType; if (controllerType != null) { dataTokens.Add(RouteDataTokenKeys.Namespaces, new[] { controllerType.Namespace }); } } Route route = new Route(detokenizedRouteTemplate, new MvcRouteHandler()) { Defaults = defaults, Constraints = constraints, DataTokens = dataTokens }; return(route); }