Sitecore LinkManager.GetItemUrl()解析为别名

时间:2012-01-09 17:44:46

标签: sitecore

我在我的国家网站上为其中一个本地网站(及其子页面)的主页创建了别名 - 我无法弄清楚这是怎么回事。

当有人登陆本地页面时,我有一个控件(cs文件),它在本地网页的左侧创建本地链接(到子页面)。这些链接派生自Sitecore上下文(当前项的内容路径)。

在我为本地站点中的所有页面创建别名后,就在我注意到这个问题的时候。如果URL是Sitecore别名,则为子别名构建导航链接 - 否则它们将由Sitecore LinkManager解析,就像创建别名之前一样。但是,当我点击原始本地项目(而不是别名)的页面时,正在为别名呈现链接:

childLink.NavigateUrl = LinkManager.GetItemUrl(child);

我已经确认子项有效。有没有人对LinkManager为什么要渲染别名的链接有任何建议 - 以及如何避免这种情况?

2 个答案:

答案 0 :(得分:2)

Sitecore.Links.LinkManager.GetItemUrl(item)返回原始项的路径,而不是别名路径。如果你有特殊的逻辑来识别别名,例如使用Sitecore.Context.RawUrl属性,你可能会遇到输出缓存的问题,当你导航到导出缓存时可能会导致控件的别名版本显示原始项目。

更新:我很确定您遇到了输出缓存问题。我能够通过创建一个测试控件来重现这种行为,该控件显示时间戳和RawUrl,并通过在Presentation Details中为控件启用输出缓存。

第一次显示控件时,无论是项目还是别名,都会缓存输出,并且每次查看控件时都会显示此缓存输出,无论是原始项目还是别名。即使您打开“按数据变化”,效果也是一样的,因为“按数据变化”是由数据源项驱动的,而不是URL。

要解决此问题,您需要将缓存状态添加到GetCachingId属性的输出中:

protected override string GetCachingID()
{
    return this.GetType().Name + (IsAlias() ? "Alias": "Item");
}

private bool IsAlias()
{
    return Sitecore.Context.Database.Aliases.Exists(Sitecore.Context.RawUrl);
}

为IsAlias逻辑支持this answer

答案 1 :(得分:0)

在这种情况下,是否依赖于web.config中的设置将给出Alias。 如果LinkManager具有设置为true的选项“ApplyAliases”(是否检查并应用别名),则LinkManager将尽可能返回别名。

您可以阅读有关配置LinkManager的更多信息,并在John West撰写的this博客页面上覆盖代码隐藏中的某些设置。

祝你好运!