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

Umbraco技术问询:如何跨页面访问已有页面字段并循环展示

嘿,这个需求在Umbraco开发里太常见了!我来给你拆解下不同版本的最优实现方案,你可以根据自己用的Umbraco版本来选:

Umbraco 9+(.NET Core 版本,含V10/V11/V12等)

这是目前的主流版本,推荐用强类型或依赖注入的方式来获取内容,既安全又符合.NET Core的最佳实践。

方法1:直接在视图中快速实现

如果需求简单,直接在目标页面的视图里注入IPublishedContentQuery就能搞定:

@inject IPublishedContentQuery PublishedContentQuery

@{
    // 获取所有已发布的「People」类型页面,记得替换成你实际的文档类型别名(一般默认小写)
    var peopleList = PublishedContentQuery.ContentOfType("people")
        .OrderBy(p => p.Value<string>("name")); // 可选:按姓名排序
}

<h2>人物列表</h2>
<div class="people-container">
    @foreach(var person in peopleList)
    {
        <div class="person-card">
            <h3>@person.Value<string>("name")</h3>
            <p>年龄:@person.Value<int>("age")</p>
            <p>职业:@person.Value<string>("job")</p>
            <p>@person.Value<string>("description")</p>
        </div>
    }
</div>

方法2:用强类型模型(更推荐)

开启Umbraco的Models Builder后,系统会自动为你的文档类型生成强类型类,不用再写字符串别名,避免拼写错误:

  1. 后台开启Models Builder(设置→Models Builder→Mode选Live App Data)
  2. 视图中直接用强类型查询:
@inject IPublishedContentQuery PublishedContentQuery

@{
    // 直接用生成的People类,不用写字符串别名
    var peopleList = PublishedContentQuery.ContentOfType<People>()
        .OrderBy(p => p.Name);
}

<h2>人物列表</h2>
<div class="people-container">
    @foreach(var person in peopleList)
    {
        <div class="person-card">
            <h3>@person.Name</h3>
            <p>年龄:@person.Age</p>
            <p>职业:@person.Job</p>
            <p>@person.Description</p>
        </div>
    }
</div>
Umbraco 8(.NET Framework 版本)

这个版本用UmbracoHelper来获取内容,写法略有不同:

@{
    // 获取所有已发布的「People」类型页面
    var peopleList = Umbraco.ContentAtRoot()
        .DescendantsOrSelf("people") // 替换成你的文档类型别名
        .Where(p => p.IsPublished()) // 确保只取已发布内容
        .OrderBy(p => p.GetPropertyValue<string>("name"));
}

<h2>人物列表</h2>
<ul class="people-list">
    @foreach(var person in peopleList)
    {
        <li>
            <h3>@person.GetPropertyValue<string>("name")</h3>
            <p>年龄:@person.GetPropertyValue<int>("age")</p>
            <p>职业:@person.GetPropertyValue<string>("job")</p>
            <p>@person.GetPropertyValue<string>("description")</p>
        </li>
    }
</ul>
关键注意事项
  • 别名要对应:文档类型和字段的别名(后台设置里的Alias)是区分大小写的,一定要和代码里的字符串一致(一般默认是小写,比如people、name)
  • 性能优化:Umbraco默认会缓存已发布内容,所以不用担心重复查询;如果数据量极大,可以考虑加分页
  • 灵活筛选:可以用.Where()添加过滤条件,比如只展示年龄大于30的人物:.Where(p => p.Value<int>("age") > 30)

内容的提问来源于stack exchange,提问作者Witted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:52:11