/// <summary> /// When overridden in a derived class, checks whether the route matches the specified values, and if so, generates a URL and retrieves information about the route. /// </summary> /// <param name="requestContext">An object that encapsulates information about the requested route.</param> /// <param name="values">An object that contains the parameters for a route.</param> /// <returns> /// An object that contains the generated URL and information about the route, or null if the route does not match <paramref name="values"/>. /// </returns> public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { var _patternData = parsedPattern; FullPathSegment fullPathSegment = _patternData.FullPathSegment; Regex urlMatch = _patternData.UrlMatch; var routeValues = new RouteValueDictionary(values); foreach (var projection in Projections) { if (projection.Value == null) { continue; } projection.Value.Outgoing(projection.Key, routeValues); } var valuesMediator = CreateMediator(requestContext, routeValues, RouteDirection.UrlGeneration); var parametersToCheck = fullPathSegment.RequiredParameters.Select(p => p.Name).Concat(systemRouteValueKeys); if (!valuesMediator.MatchConstraints(new HashSet <string>(parametersToCheck))) { return(null); } var url = ConstructUrl(fullPathSegment, valuesMediator); if (url == null || !urlMatch.IsMatch(url)) { return(null); } url = url.ToLowerInvariant(); var queryString = BuildQueryString(valuesMediator, routeValues); if (queryString != null) { url += "?" + queryString; } var data = new VirtualPathData(this, url); this.DataTokens.CopyTo(data.DataTokens); return(data); }
public ParsedRoutePattern(Regex urlMatch, FullPathSegment fullPathSegment) { UrlMatch = urlMatch; FullPathSegment = fullPathSegment; }
/// <summary> /// Constructs the URL for the specified <paramref name="path"/> using the <paramref name="valuesMediator"/>. /// </summary> /// <param name="path">The path segments tree.</param> /// <param name="valuesMediator">The route values mediator.</param> /// <returns>Returns the constructed URL or <c>null</c> if the URL cannot be constructed.</returns> protected virtual string ConstructUrl(FullPathSegment path, RouteValuesMediator valuesMediator) { return((string)path.GetUrlPart((s) => valuesMediator.ResolveValue(s))); }
/// <summary> /// Extracts the route values for the specified <paramref name="path"/> from the <paramref name="match"/>. /// </summary> /// <param name="path">The path segments tree.</param> /// <param name="match">The successful match result to extract values from.</param> /// <param name="valuesMediator">The route values mediator.</param> protected virtual void ExtractRouteValues(FullPathSegment path, Match match, RouteValuesMediator valuesMediator) { path.ExtractRouteValues(match, valuesMediator.SetValue); }
/// <summary> /// Builds the <see cref="Regex"/> instance based on the specified <paramref name="path"/> for matching the concrete URLs. /// </summary> /// <param name="path">The parsed path segments tree.</param> /// <returns>Returns the <see cref="Regex"/> instance used to match the concrete URLs.</returns> protected virtual Regex BuildRegex(FullPathSegment path) { var options = RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Singleline; return(new Regex(path.GetRegexPattern(), options)); }