EpiServer - 为页面

时间:2015-04-27 13:54:28

标签: episerver episerver-7

我在管理网站面板

中进行了以下设置
  

常规网址设置为 alloy.com

     为文化设置

alloy.no

     为 sv 文化设置

alloy.se

     为 en 文化

设置了

alloy.com

在我的代码中,我希望为给定页面获取给定语言的友好外部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 网页并在我的自定义代码中生成友好网址,这很简单。

  • - alloy.no/søk
  • se - alloy.se/sök
  • zh_ - alloy.com/search

但是当我使用 alloy.no 进入编辑模式时,我会尝试生成没有的地址我得到合金。 com /søk应该是合金。 /søk

我发现如果我使用 alloy.no 转到编辑模式,请输入代码:

urlResolver.GetUrl(reference, language)

仅返回 /søk 和代码

UriSupport.AbsoluteUrlBySettings(builder.ToString())

添加常规网址(alloy.com)而不是alloy.no。

如何改进此代码,为不同文化中的页面获取正确的主机名?

4 个答案:

答案 0 :(得分:4)

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。但在这种情况下,我选择直接使用它来保持示例更加包含。

答案 1 :(得分:2)

我们有一个支持案例。我们希望url解析器在请求规范URL时始终返回绝对URL。这是我们目前的解决方案:

<input name="note" size="100" value="<? echo $note; ?>"></input>          

答案 2 :(得分:1)

在编写在多语言,多主机名网站上运行的预定作业时,我也遇到了此问题。为了在没有HttpContext的情况下获得具有正确主机名的绝对URL,我必须将Henrik的代码与Dejan的代码结合起来:https://www.dcaric.com/blog/episerver-how-to-get-external-page-url

这就是我提出的:

public static string ExternalUrl(this ContentReference contentLink, CultureInfo language)
{
    var urlString = UrlResolver.Current.GetUrl(contentLink, language.Name, new VirtualPathArguments { ForceCanonical = true });

    var uri = new Uri(urlString, UriKind.RelativeOrAbsolute);
    if (uri.IsAbsoluteUri) return urlString;

    string externalUrl = HttpContext.Current == null
        ? UriSupport.AbsoluteUrlBySettings(urlString)
        : HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + urlString;

    return externalUrl;
}

答案 3 :(得分:0)

我已经设法根据Johan&amp; Henry回答:

public static string GetExternalAbsoluteFriendlyUrl(
    this ContentReference reference,
    string language)
{
    var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
    var friendlyUrl = urlResolver.GetUrl(reference, language);

    if (string.IsNullOrEmpty(friendlyUrl))
        return friendlyUrl;

    var uri = new Uri(friendlyUrl, UriKind.RelativeOrAbsolute);
    if (uri.IsAbsoluteUri)
        return friendlyUrl;

    if (HttpContext.Current != null)
        return new Uri(HttpContext.Current.Request.Url, uri).ToString();

    var siteDefinitionResolver =
        ServiceLocator.Current.GetInstance<SiteDefinitionResolver>();
    var siteDefinition =
        siteDefinitionResolver.GetDefinitionForContent(reference, true, true);

    return new Uri(siteDefinition.SiteUrl, friendlyUrl).ToString();
}