Sitecore LinkManager.GetItemUrl()解析为别名

Sitecore LinkManager.GetItemUrl()解析为别名,sitecore,Sitecore,我已经在我的国家网站上为一个本地网站(及其子页面)的主页创建了别名——我不知道这是怎么发生的 当有人登陆本地页面时,我有一个控件(cs文件),它在本地网页的左侧创建本地链接(到子页面)。这些链接来自Sitecore上下文(当前项目的内容路径) 在我为本地站点中的所有页面创建别名之后,我注意到了这个问题。如果URL是Sitecore别名,则会为子别名生成导航链接,否则将由Sitecore链接管理器解析,就像创建别名之前一样。但是,当我点击原始本地项(而不是别名)的页面时,将呈现别名的链接: chi

我已经在我的国家网站上为一个本地网站(及其子页面)的主页创建了别名——我不知道这是怎么发生的

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

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

childLink.NavigateUrl=LinkManager.GetItemUrl(子项)


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

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

您可以在John West撰写的博客页面上阅读更多关于配置LinkManager和覆盖codebehind中某些设置的信息


祝你好运

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逻辑的道具。

您是否使用自定义的
链接提供程序
,例如来自共享源代码库的?您能否提供一些示例,说明如何更好地理解和解决此问题?不,它实际上位于Sitecore.Kernel.dll的“Sitecore.Links.LinkManager”中。简而言之,当我到达以下代码行时:Url=LinkManager.GetItemUrl(childItem)-它生成指向项目的别名链接,而不是实际内容项目的链接。因此,我传入一个确实为其定义了别名的项,但我不认为该方法应该返回别名链接。除非我错了,否则它应该返回到您传递的Sitecore项目的实际链接。嗨,他使用的是标准链接提供程序,没有“ApplyAlias”选项。web.config中唯一的另一个选项就是打开或关闭别名。好吧,我没有想到这一点——我会尝试一下这段代码。谢谢很好的解决方案。我也看到了你的博客!大家好,我可以知道这是否已经在Sitecore 6.4++中修复了吗?不,我在6.4中对此进行了研究。此行为是Sitecore中别名实现方式的结果:当您通过别名命中一个项时,上下文项就是原始引用项。