我们有我们需要做同样的事情来建立我们的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