我已经为我的国家网站中的本地站点之一(及其子页面)的主页创建了别名 - 但我不知道这是如何发生的。
当有人登陆本地页面时,我有一个控件(cs 文件),可以在本地网页的左侧创建本地链接(到子页面)。这些链接源自 Sitecore 上下文(当前项目的内容路径)。
在我为本地站点中的所有页面创建别名后,我就注意到了这个问题。如果 URL 是 Sitecore 别名,则为子别名构建导航链接 - 否则它们由 Sitecore LinkManager 解析,就像创建别名之前一样。但是,当我点击原始本地项目(而不是别名)的页面时,正在为别名呈现链接:
childLink.NavigateUrl = LinkManager.GetItemUrl(child);
并且我已验证子项目有效。对于 LinkManager 为什么要呈现别名的链接,以及如何避免这种情况,有人有任何建议吗?
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 逻辑。
在这种情况下,是否给出别名取决于 web.config 中的设置。 如果 LinkManager 将选项“ApplyAliases”(是否在可能的情况下检查并应用别名)设置为 true,则 LinkManager 将在可能的情况下返回别名。
您可以在 John West 撰写的this博客页面上阅读有关配置 LinkManager 以及覆盖代码隐藏中的某些设置的更多信息。
祝你好运!