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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:02:26