我們有我們需要做同樣的事情來建立我們的hreflang標記一個多語種的網站。可能有更好的方法,但我決定構建一些Xpath來查找其他語言是否存在匹配節點。我們使用的是umbraco 7,如果可能的話,我會避免使用NodeFactory。它被折舊。使用一把umbraco助手將無法訪問數據庫,並且是查詢到一把umbraco發佈的內容或媒體一把umbraco 7
public static IPublishedContent GetLocalizedVersionOfPage(this IPublishedContent node, string regionName)
{
var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
var ancestorNames = node.AncestorsOrSelf()
.Where(n => n.Level > 1)
.OrderBy(n => n.Level)
.Select(n => n.Name).ToList();
var xpath = new StringBuilder();
xpath.AppendFormat("/root/HomePage[@nodeName='{0}']", regionName);
foreach (var ancestorName in ancestorNames)
{
xpath.AppendFormat("/*[@nodeName='{0}']", ancestorName);
}
var matchingNode = umbracoHelper.TypedContentAtXPath(xpath.ToString()).FirstOrDefault();
return matchingNode;
}
以上方法對IPublishedContent擴展方法的最佳途徑之一。它允許您傳入該區域,並檢查指定區域中是否存在具有由節點名稱確定的相同路徑的節點。我想過使用urlname而不是節點名稱。你可以做到這一點,以及,甚至使這種更快的通過跳過一段代碼,做了.AncestorsOrSelf()
。這取決於你希望如何工作。就我而言,我希望它查找基於即使URL路徑是不同的節點名稱匹配,所以我不得不做.AncestorsOrSelf()
。希望這可以幫助。
要考慮的另一件事是如何調用此方法。如果你使用這樣一個循環:
@foreach (var region in Umbraco.TypedContentAtRoot().Where(n => n.IsDocumentType("HomePage")))
{
var localizedVersion = currentPage.GetLocalizedVersionOfPage(region.Name);
if (localizedVersion != null)
{
<link rel="alternate" href="@localizedVersion.UrlAbsolute()" hreflang="@LocalizeUtils.GetCulture(region.Name)" />
}
}
你最終將獲得當前節點的祖先遍地一次爲每個區域,因爲它調用.AncestorsOrSelf()
每次調用GetLocalizedVersionOfPage()
時間。重構GetLocalizedVersionOfPage
方法可能很有意義,因此您只需撥打.AncestorsOrSelf
一次。如果你多次做這類事情,它開始影響性能(特別是如果你的網站是非常嵌套的話)。
我使用了業務邏輯,完全是因爲它不需要xpath查詢。你的鏈接提供商聽起來很有趣! – AyKarsi 2010-10-04 07:02:03
你有沒有發佈過這個?我真的想通過路徑獲取節點,因爲我有一個需要來自某個與當前頁面無關的任意路徑的數據的控件。 – jimplode 2010-11-30 14:07:32