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

在UmbracoApiController中创建含ContentPicker的NestedContent项

在UmbracoApiController中创建带NestedContent的Event节点

嘿,我来帮你搞定这个需求!首先得搞清楚:Umbraco里的NestedContent是用JSON数组存储的,每个嵌套项都要指定对应的ContentType别名和属性值(这里就是ContentPicker的节点ID)。下面是完整的实现代码和注意事项:

1. 完整的Api控制器代码

public class EventApiController : UmbracoApiController
{
    public IHttpActionResult CreateEvent(string eventName, List<int> categoryIds)
    {
        // 先找到要存放Event的父节点,这里假设父节点的ContentType别名是"events",你按需调整
        var parentNode = Umbraco.ContentAtRoot().FirstOrDefault(x => x.ContentType.Alias == "events");
        if (parentNode == null)
        {
            return BadRequest("找不到存放Event的父节点哦");
        }

        // 创建基础的Event节点
        var newEvent = Services.ContentService.CreateContent(
            eventName,
            parentNode.Id,
            "event" // 这里填你的Event DocumentType别名
        );

        // 专门处理eventCategories这个NestedContent属性
        SetupNestedContentCategories(newEvent, categoryIds);

        // 保存并发布节点,顺便处理可能的错误
        var saveResult = Services.ContentService.SaveAndPublish(newEvent);
        if (!saveResult.Success)
        {
            var errorMsg = string.Join("、", saveResult.Errors);
            return BadRequest($"创建Event节点失败啦:{errorMsg}");
        }

        return Ok($"Event节点创建成功!ID是:{newEvent.Id}");
    }

    // 封装设置NestedContent的方法,代码更整洁
    private void SetupNestedContentCategories(IContent eventNode, List<int> categoryIds)
    {
        var nestedItems = new List<Dictionary<string, object>>();

        foreach (var categoryId in categoryIds)
        {
            // 这里要替换成你实际的NestedContent子项的ContentType别名
            var nestedItem = new Dictionary<string, object>
            {
                {"contentTypeAlias", "eventCategoryPicker"},
                {"category", categoryId} // 这里是NestedContent子项里ContentPicker的属性别名,按需替换
            };
            nestedItems.Add(nestedItem);
        }

        // 把列表序列化成JSON字符串,赋值给eventCategories属性
        var nestedContentJson = Newtonsoft.Json.JsonConvert.SerializeObject(nestedItems);
        eventNode.SetValue("eventCategories", nestedContentJson);
    }
}

2. 几个必须注意的关键点

  • 一定要替换别名:把代码里的eventCategoryPicker(NestedContent子项的ContentType别名)和category(子项中ContentPicker的属性别名)换成你自己项目里的实际别名,不然肯定跑不通!
  • 父节点逻辑:获取父节点的方式根据你的站点结构调整,比如可以直接用父节点ID,或者通过路径查找,灵活处理。
  • 序列化依赖:Umbraco默认已经引用了Newtonsoft.Json,所以不用额外安装包,直接用就行。

3. 怎么测试?

你可以用Postman或者其他API工具发POST请求到/umbraco/api/eventapi/createevent,传递eventName(字符串)和categoryIds(整数数组)这两个参数,就能创建带分类的Event节点啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:32:46