General Url is set to alloy.com
alloy.no is set for no culture
alloy.se is set for sv culture
alloy.com is set for en culture
在我的代码中,我想获得给定页面的给定语言的友好外部URL.
因此,对于搜索页面,我希望获得所有语言的绝对友好网址.
我使用以下代码获取页面的友好URL(在Anders G. Nordby blog上找到):
var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>(); var pageAddress = urlResolver.GetUrl(reference, language); var builder = new UrlBuilder(pageAddress); Global.UrlRewriteProvider.ConvertToExternal(builder, null, Encoding.UTF8); var friendlyUrl = builder.Uri.IsAbsoluteUri ? builder.ToString() : UriSupport.AbsoluteUrlBySettings(builder.ToString()); return friendlyUrl;
如果我将使用alloy.com网页并在我的自定义代码中生成友好的URL,这很简单.
> no – alloy.no/søk
> se – alloy.se/sök
> en – alloy.com/search
但是当我使用alloy.no进入编辑模式时,我会尝试生成地址,因为它应该是alloy.no/søk,而不是我得到alloy.com/søk.
我发现如果我使用alloy.no进入编辑模式,代码:
urlResolver.GetUrl(reference, language)
仅返回/søk和代码
UriSupport.AbsoluteUrlBySettings(builder.ToString())
添加常规URL(alloy.com)而不是alloy.no.
如何改进此代码以在不同文化中为页面获取正确的主机名?
UrlResolver的GetUrl方法将根据当前请求上下文将URL返回到相对或绝对的页面.如果页面位于当前站点中,则URL将是相对的;如果在另一个站点中,则URL是绝对的,或者如果在请求之外进行调用,则URL将是相对的.如果您使用的是EPiServer.CMS.Core 8.0或更高版本,则还支持将一个站点标识为主站点.此更新还可以通过在VirtualPathArguments参数上设置ForceCanonical标志,明确请求URL应该是主站点.如果没有设置标志,它将优先选择主节点上的当前站点URL(假设请求的内容位于当前站点上).
因此,考虑到这一点,您可以假设返回的URL(如果不是绝对的话)将相对于当前请求的站点并安全地将其与当前请求的URL组合,例如:
private static string ExternalUrl(this ContentReference contentLink, CultureInfo language) { var urlString = UrlResolver.Current.GetUrl(contentLink, language.Name, new VirtualPathArguments { ForceCanonical = true }); if (string.IsNullOrEmpty(urlString) || HttpContext.Current == null) return urlString; var uri = new Uri(urlString, UriKind.RelativeOrAbsolute); if (uri.IsAbsoluteUri) return urlString; return new Uri(HttpContext.Current.Request.Url, uri).ToString(); }
在大多数情况下,我可能不希望直接使用HttpContext.Current,而是传入当前请求URL.但在这种情况下,我选择直接使用它来保持示例更加包含.