Umbraco 13 API控制器如何获取特定文档类型的全部内容项?
Umbraco API控制器获取全量内容项的正确实现
一、先明确两个核心服务的区别
- IContentService:操作数据库中所有内容(包含未发布、草稿状态),适合后台管理类API
- IPublishedContentQuery:仅获取已发布的内容,性能更优,适合面向前台的API
二、获取某文档类型的全量内容项
场景1:获取所有状态的内容(用IContentService)
不用硬编码页大小,先通过GetCountOfType获取该类型内容的总数量,再一次性拉取全量数据:
using (var umbracoContext = _contextFactory.EnsureUmbracoContext()) using (var scope = _scopeProvider.CreateScope()) { var contentType = umbracoContext.UmbracoContext.Content.GetContentType("aktivitet") ?? throw new InvalidOperationException("文档类型\"aktivitet\"不存在"); // 获取该文档类型的内容总条数 var totalCount = _contentService.GetCountOfType(contentType.Id); // 一次性获取所有内容 var allItems = _contentService.GetPagedOfType( contentType.Id, pageIndex: 0, pageSize: totalCount, out _, null ); var mapper = new AktivitetMapper(_contentService); return allItems.Select(mapper.Map).ToList(); }
场景2:获取已发布的内容(用IPublishedContentQuery)
如果你的API是给前台业务用的,优先用这个,只返回已发布的有效内容:
// 构造函数注入IPublishedContentQuery(Umbraco 9+已默认注册) private readonly IPublishedContentQuery _publishedContentQuery; public AktivitetApiController(IPublishedContentQuery publishedContentQuery, ...) { _publishedContentQuery = publishedContentQuery; } public IActionResult GetAllAktiviteter() { // 获取所有已发布的"aktivitet"类型内容 var allPublishedItems = _publishedContentQuery.ContentOfType("aktivitet").ToList(); var mapper = new AktivitetMapper(_contentService); return Ok(allPublishedItems.Select(mapper.Map).ToList()); }
三、根据节点ID获取单个内容项
对应场景1(所有状态内容)
public IActionResult GetAktivitetById(int id) { using (var scope = _scopeProvider.CreateScope()) { var contentItem = _contentService.GetById(id); if (contentItem == null || contentItem.ContentType.Alias != "aktivitet") { return NotFound(); } var mapper = new AktivitetMapper(_contentService); return Ok(mapper.Map(contentItem)); } }
对应场景2(已发布内容)
public IActionResult GetPublishedAktivitetById(int id) { var contentItem = _publishedContentQuery.Content(id); if (contentItem == null || contentItem.ContentType.Alias != "aktivitet") { return NotFound(); } var mapper = new AktivitetMapper(_contentService); return Ok(mapper.Map(contentItem)); }
注意事项
- 避免硬编码页大小,用总数量动态获取全量数据更可靠
- 如果该文档类型内容量极大(比如上万条),建议保留分页逻辑,避免内存溢出
- Umbraco 9+推荐依赖注入方式获取服务,控制器内的Scope通常会自动管理,无需手动创建(除非需要手动控制事务)
内容的提问来源于stack exchange,提问作者Leth
相关产品推荐
相关产品推荐

