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后,系统会自动为你的文档类型生成强类型类,不用再写字符串别名,避免拼写错误:
- 后台开启Models Builder(设置→Models Builder→Mode选Live App Data)
- 视图中直接用强类型查询:
@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
相关产品推荐
相关产品推荐

