/// <summary>
        /// Builds the query string based on the extra route values which were passed explicitly but not used in URL construction.
        /// </summary>
        /// <param name="valuesMediator">The route values mediator used for URL construction.</param>
        /// <param name="values">The current route values.</param>
        /// <returns>Returns the query string or <c>null</c> when it cannot be built.</returns>
        protected virtual string BuildQueryString(RouteValuesMediator valuesMediator, RouteValueDictionary values)
        {
            var queryString = new List <KeyValuePair <string, object> >();

            foreach (var entry in values)
            {
                if (systemRouteValueKeys.Contains(entry.Key) ||
                    valuesMediator.VisitedKeys.Contains(entry.Key) ||
                    valuesMediator.InvalidatedKeys.Contains(entry.Key) ||
                    entry.Value == null ||
                    OutgoingDefaults.HasValue(entry.Key, entry.Value) ||
                    IncomingDefaults.HasValue(entry.Key, entry.Value))
                {
                    continue;
                }

                queryString.Add(entry);
            }

            if (queryString.Count == 0)
            {
                return(null);
            }

            var pairs = queryString.Select(e => HttpUtility.UrlEncode(e.Key) + "=" + HttpUtility.UrlEncode(e.Value.ToString()));

            return(string.Join("&", pairs));
        }
 /// <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);
 }