Sitecore LinkManager.GetItemUrl() 解析为别名

问题描述 投票:0回答:2

我已经为我的国家网站中的本地站点之一(及其子页面)的主页创建了别名 - 但我不知道这是如何发生的。

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

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

childLink.NavigateUrl = LinkManager.GetItemUrl(child);

并且我已验证子项目有效。对于 LinkManager 为什么要呈现别名的链接,以及如何避免这种情况,有人有任何建议吗?

sitecore
2个回答
2
投票

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

更新:我很确定您遇到了输出缓存问题。我能够通过创建一个显示时间戳和 RawUrl 的测试控件并通过在“演示详细信息”中打开该控件的输出缓存来重现此行为。

第一次显示控件时,无论是针对项目还是别名,输出都会被缓存,并且每次查看控件时都会显示此缓存的输出,无论是针对原始项目还是别名。即使打开“Vary By Data”,效果也是一样的,因为“Vary By Data”是由数据源项驱动的,而不是 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 逻辑。


0
投票

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

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

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.