internal IHtmlString GeneratePageUrl(UrlHelper urlHelper, Site site, Page page, object values, FrontRequestChannel channel) { RouteValueDictionary routeValues = RouteValuesHelper.GetRouteValues(values); if (page == null) { return(new HtmlString("")); } var route = page.Routes == null ? null : page.Routes.FirstOrDefault(); //if (route != null && !string.IsNullOrEmpty(route.ExternalUrl)) //{ // return new HtmlString(route.ExternalUrl); //} var pageRoute = route.ToMvcRoute(); routeValues = RouteValuesHelper.MergeRouteValues(pageRoute.Defaults, routeValues); var routeVirtualPath = pageRoute.GetVirtualPath(urlHelper.RequestContext, routeValues); if (routeVirtualPath == null) { Kooboo.Common.Logging.Logger.LoggerInstance.Warn(string.Format("Invalid page URL route. Page:{0}", page.AbsoluteName)); } //string contentUrl = routeVirtualPath.VirtualPath;//don't decode the url. why?? //if do not decode the url, the route values contains Chinese character will cause bad request. string contentUrl = HttpUtility.UrlDecode(routeVirtualPath.VirtualPath); string pageUrl = contentUrl; if (!string.IsNullOrEmpty(contentUrl) || (string.IsNullOrEmpty(pageUrl) && !page.IsDefault)) { pageUrl = Kooboo.Common.Web.UrlUtility.Combine(page.GetVirtualPath(route), contentUrl); } if (string.IsNullOrEmpty(pageUrl)) { pageUrl = urlHelper.Content("~/"); } else { pageUrl = HttpUtility.UrlDecode( urlHelper.RouteUrl("Page", new { PageUrl = new HtmlString(pageUrl) })); } var url = this.WrapperUrl(pageUrl, page.RequireHttps); return(url); }