コード例 #1
0
        /// <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);
        }
コード例 #2
0
 public ParsedRoutePattern(Regex urlMatch, FullPathSegment fullPathSegment)
 {
     UrlMatch        = urlMatch;
     FullPathSegment = fullPathSegment;
 }
コード例 #3
0
 /// <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)));
 }
コード例 #4
0
 /// <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);
 }
コード例 #5
0
        /// <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));
        }