2012-01-09 67 views
2

我已經在我的國家網站上創建了一個本地網站(以及它的子頁面)主頁的別名 - 我無法弄清楚這是如何發生的。Sitecore LinkManager.GetItemUrl()解析爲別名

當某人登錄本地頁面時,我有一個控件(cs文件),用於在本地網頁的左側創建本地鏈接(到子頁面)。這些鏈接源自Sitecore上下文(當前項目的內容路徑)。

在我爲本地站點中的所有頁面創建了別名之後,我就注意到了這個問題。如果URL是一個Sitecore別名,則導航鏈接是爲子別名而構建的 - 否則它們將由Sitecore LinkManager解析,就像它們在創建別名之前一樣。但是,當我點擊原始本地項目(而不是別名)的頁面時,鏈接正在呈現別名:

childLink.NavigateUrl = LinkManager.GetItemUrl(child);

而且我已驗證該子項是有效的。有沒有人有任何建議,爲什麼LinkManager會爲別名渲染鏈接 - 以及如何避免這種情況?

+0

您是否正在使用自定義'LinkProvider',如共享源庫中的[LinkProvider](http://trac.sitecore.net/LinkProvider/browser/Trunk/Links/LinkProvider.cs)? – 2012-01-09 18:45:49

+0

不,它實際上來自Sitecore.Kernel.dll中的「Sitecore.Links.LinkManager」。 – sean 2012-01-09 19:25:15

+0

您能提供一些正在發生的事例來更好地理解和解決問題嗎? – aspnetdeveloper 2012-01-09 19:24:15

回答

2

Sitecore.Links.LinkManager.GetItemUrl(item)返回原始項目的路徑,而不是別名路徑。如果您有特殊的邏輯來識別別名,例如使用Sitecore.Context.RawUrl屬性,則可能會遇到輸出緩存問題,這可能會導致在導航到原始項目時顯示控件的別名版本。

更新:我很確定你正在運行輸出緩存問題。我能夠通過創建一個測試控件來重現此行爲,該控件顯示一個時間戳和RawUrl,並在Presentation Details中打開控件的輸出緩存。

第一次顯示控件時,無論是用於項目還是別名,輸出都會被緩存,並且每次查看控件時都會顯示此緩存輸出,無論是原始項目還是別名。即使您打開「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); 
} 

道具this answer爲IsAlias邏輯。

+0

好的,我沒有想到 - 我會試一試這個代碼。謝謝! – sean 2012-01-17 17:28:01

+0

偉大的解決方案在這裏。我也看到了你的博客文章! – 2012-01-18 21:16:20

+0

嗨,大家好,我知道這是否已被固定在Sitecore 6.4 ++中? – ronanray 2012-11-08 07:57:16

0

在這種情況下,是否給予別名依賴於web.config中的設置。 如果LinkManager具有選項「ApplyAliases」(如果可能,是否檢查並應用別名)設置爲true,LinkManager將盡可能返回別名。

您可以閱讀更多關於配置您的LinkManager的信息,並在約翰韋斯特編寫的this博客頁面上覆蓋代碼隱藏中的某些設置。

祝你好運!

+0

嗨, 他使用沒有'applyaliases'選項的標準鏈接提供程序。 web.config中唯一的其他選項只是打開或關閉別名。 – 2012-01-10 17:01:48