You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:55:22