将Umbraco 7网站迁移至11:节点内项目过滤问题求助
Umbraco 7 迁移至 Umbraco 11 代码修正方案
原代码逻辑分析
原Umbraco 7代码的核心逻辑是:
- 获取ID为1234的节点
- 先将
Section_pages赋值为该节点的可见子节点 - 随后覆盖
Section_pages为该节点自身及其所有后代中,节点类型别名为blogPosts的节点
转换代码的错误点
你当前的转换代码存在两个关键问题:
- 误用了旧版Umbraco的动态查询语法(
NodeTypeAlias("@0")、.And().Field()),Umbraco 11基于.NET 7,已改用强类型LINQ查询 - 多余添加了
Field("NewsPage")过滤条件,原代码无此逻辑
正确的Umbraco 11代码实现
// 获取目标节点,必须做空值判断避免空引用异常 var sectionNode = Umbraco.Content(1234); if (sectionNode != null) { // 对应原代码第一步:获取节点的可见子节点(若不需要可删除) var sectionPages = sectionNode.Children.Where(x => x.IsVisible()); // 对应原代码第二步:覆盖为节点自身及后代中类型别名为"blogPosts"的节点 sectionPages = sectionNode.DescendantsOrSelf() .Where(x => x.ContentType.Alias == "blogPosts"); }
可选扩展:同时过滤可见性与节点类型
如果你的实际需求是获取**可见且类型别名为blogPosts**的节点(原代码未体现此逻辑,仅作补充),可修改为:
sectionPages = sectionNode.DescendantsOrSelf() .Where(x => x.ContentType.Alias == "blogPosts" && x.IsVisible());
关键API变化说明
- Umbraco 11中
Umbraco.Content(id)返回IPublishedContent类型,需通过ContentType.Alias获取节点类型别名 - 节点可见性判断使用
IsVisible()方法(这部分你当前的写法是正确的) - 旧版动态查询语法(字符串条件)已弃用,全部改用强类型LINQ表达式
内容的提问来源于stack exchange,提问作者Menahem Gil
相关产品推荐
相关产品推荐

