private static bool TryExpandUriParameters(IHttpRoute route, string routeTemplate, ICollection <ApiParameterDescription> parameterDescriptions, out string expandedRouteTemplate) { HttpParsedRoute parsedRoute = HttpRouteParser.Parse(routeTemplate); Dictionary <string, object> parameterValuesForRoute = new Dictionary <string, object>(); foreach (ApiParameterDescription parameterDescriptor in parameterDescriptions) { Type parameterType = parameterDescriptor.ParameterDescriptor.ParameterType; if (parameterDescriptor.Source == ApiParameterSource.FromUri && TypeHelper.IsSimpleUnderlyingType(parameterType)) { parameterValuesForRoute.Add(parameterDescriptor.Name, "{" + parameterDescriptor.Name + "}"); } } BoundRouteTemplate boundRouteTemplate = parsedRoute.Bind(null, parameterValuesForRoute, new HttpRouteValueDictionary(route.Defaults), new HttpRouteValueDictionary(route.Constraints)); if (boundRouteTemplate == null) { expandedRouteTemplate = null; return(false); } expandedRouteTemplate = Uri.UnescapeDataString(boundRouteTemplate.BoundTemplate); return(true); }
// Set as internal for the unit test. internal static bool TryExpandUriParameters(IHttpRoute route, HttpParsedRoute parsedRoute, ICollection <ApiParameterDescription> parameterDescriptions, out string expandedRouteTemplate) { Dictionary <string, object> parameterValuesForRoute = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); bool emitPrefixes = ShouldEmitPrefixes(parameterDescriptions); string prefix = String.Empty; foreach (ApiParameterDescription parameterDescriptor in parameterDescriptions) { if (parameterDescriptor.Source == ApiParameterSource.FromUri) { if (parameterDescriptor.ParameterDescriptor == null || (parameterDescriptor.ParameterDescriptor != null && TypeHelper.CanConvertFromString(parameterDescriptor.ParameterDescriptor.ParameterType))) { if (!parameterValuesForRoute.ContainsKey(parameterDescriptor.Name)) { parameterValuesForRoute.Add(parameterDescriptor.Name, "{" + parameterDescriptor.Name + "}"); } } else if (parameterDescriptor.ParameterDescriptor != null && parameterDescriptor.CanConvertPropertiesFromString()) { if (emitPrefixes) { prefix = parameterDescriptor.Name + "."; } // Inserting the individual properties of the object in the query string // as all the complex object can not be converted from string, but all its // individual properties can. foreach (PropertyInfo property in parameterDescriptor.GetBindableProperties()) { string queryParameterName = prefix + property.Name; if (!parameterValuesForRoute.ContainsKey(queryParameterName)) { parameterValuesForRoute.Add(queryParameterName, "{" + queryParameterName + "}"); } } } } } BoundRouteTemplate boundRouteTemplate = parsedRoute.Bind(null, parameterValuesForRoute, new HttpRouteValueDictionary(route.Defaults), new HttpRouteValueDictionary(route.Constraints)); if (boundRouteTemplate == null) { expandedRouteTemplate = null; return(false); } expandedRouteTemplate = Uri.UnescapeDataString(boundRouteTemplate.BoundTemplate); return(true); }
// Set as internal for the unit test. internal static bool TryExpandUriParameters(IHttpRoute route, HttpParsedRoute parsedRoute, ICollection <ApiParameterDescription> parameterDescriptions, out string expandedRouteTemplate) { Dictionary <string, object> parameterValuesForRoute = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); bool emitPrefixes = ShouldEmitPrefixes(parameterDescriptions); string prefix = String.Empty; foreach (ApiParameterDescription parameterDescription in parameterDescriptions) { if (parameterDescription.Source == ApiParameterSource.FromUri) { if (parameterDescription.ParameterDescriptor == null) { // Undeclared route parameter handling generates query string like // "?name={name}" AddPlaceholder(parameterValuesForRoute, parameterDescription.Name); } else if (TypeHelper.CanConvertFromString(parameterDescription.ParameterDescriptor.ParameterType)) { // Simple type generates query string like // "?name={name}" AddPlaceholder(parameterValuesForRoute, parameterDescription.Name); } else if (IsBindableCollection(parameterDescription.ParameterDescriptor.ParameterType)) { string parameterName = parameterDescription.ParameterDescriptor.ParameterName; Type innerType = GetCollectionElementType(parameterDescription.ParameterDescriptor.ParameterType); PropertyInfo[] innerTypeProperties = ApiParameterDescription.GetBindableProperties(innerType).ToArray(); if (innerTypeProperties.Any()) { // Complex array and collection generate query string like // "?name[0].foo={name[0].foo}&name[0].bar={name[0].bar} // &name[1].foo={name[1].foo}&name[1].bar={name[1].bar}" AddPlaceholderForProperties(parameterValuesForRoute, innerTypeProperties, parameterName + "[0]."); AddPlaceholderForProperties(parameterValuesForRoute, innerTypeProperties, parameterName + "[1]."); } else { // Simple array and collection generate query string like // "?name[0]={name[0]}&name[1]={name[1]}". AddPlaceholder(parameterValuesForRoute, parameterName + "[0]"); AddPlaceholder(parameterValuesForRoute, parameterName + "[1]"); } } else if (IsBindableKeyValuePair(parameterDescription.ParameterDescriptor.ParameterType)) { // KeyValuePair generates query string like // "?key={key}&value={value}" AddPlaceholder(parameterValuesForRoute, "key"); AddPlaceholder(parameterValuesForRoute, "value"); } else if (IsBindableDictionry(parameterDescription.ParameterDescriptor.ParameterType)) { // Dictionary generates query string like // "?dict[0].key={dict[0].key}&dict[0].value={dict[0].value} // &dict[1].key={dict[1].key}&dict[1].value={dict[1].value}" string parameterName = parameterDescription.ParameterDescriptor.ParameterName; AddPlaceholder(parameterValuesForRoute, parameterName + "[0].key"); AddPlaceholder(parameterValuesForRoute, parameterName + "[0].value"); AddPlaceholder(parameterValuesForRoute, parameterName + "[1].key"); AddPlaceholder(parameterValuesForRoute, parameterName + "[1].value"); } else if (parameterDescription.CanConvertPropertiesFromString()) { if (emitPrefixes) { prefix = parameterDescription.Name + "."; } // Inserting the individual properties of the object in the query string // as all the complex object can not be converted from string, but all its // individual properties can. AddPlaceholderForProperties(parameterValuesForRoute, parameterDescription.GetBindableProperties(), prefix); } } } BoundRouteTemplate boundRouteTemplate = parsedRoute.Bind(null, parameterValuesForRoute, new HttpRouteValueDictionary(route.Defaults), new HttpRouteValueDictionary(route.Constraints)); if (boundRouteTemplate == null) { expandedRouteTemplate = null; return(false); } expandedRouteTemplate = Uri.UnescapeDataString(boundRouteTemplate.BoundTemplate); return(true); }