在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
相关产品推荐
相关产品推荐

