Umbraco 7.7.8:如何通过编程向Grid布局插入数据?
当然可以实现!在Umbraco 7.7.8中给Grid布局里的RTE字段赋值
因为Grid布局的内容是以JSON格式存储的,不像普通RTE字段直接存HTML文本,所以得先解析Grid的结构,找到目标RTE控件后修改内容,再序列化回JSON赋值给Grid属性。下面是具体的实现方案:
核心思路
Umbraco的Grid数据对应Umbraco.Core.Models.Grid.GridData模型,我们需要:
- 读取Grid属性的JSON字符串并反序列化为
GridData对象 - 遍历Grid的Sections → Rows → Areas → Controls,找到类型为RTE的控件
- 修改该控件的HTML内容
- 将修改后的
GridData序列化为JSON字符串,重新赋值给Grid属性 - 保存内容节点
代码实现示例(后台操作场景)
假设你是在后台通过IContentService操作内容节点,代码如下:
using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Grid; using Umbraco.Core.Services; using Newtonsoft.Json; // 注入IContentService(或者根据你的获取方式拿到实例) var contentService = ApplicationContext.Current.Services.ContentService; // 获取目标内容节点(这里用节点ID举例,你可以换成自己的获取方式) IContent contentNode = contentService.GetById(1234); if (contentNode != null) { // 1. 获取Grid属性的JSON字符串 string gridJson = contentNode.Properties["bodyTextGrid"].Value?.ToString(); if (!string.IsNullOrEmpty(gridJson)) { // 2. 反序列化为GridData对象 GridData gridData = JsonConvert.DeserializeObject<GridData>(gridJson); // 3. 遍历Grid结构,找到所有RTE控件并修改内容 foreach (var section in gridData.Sections) { foreach (var row in section.Rows) { foreach (var area in row.Areas) { foreach (var control in area.Controls) { // 判断是否是RTE编辑器(Umbraco默认RTE的editor alias是"rte") if (control.Editor.Alias.Equals("rte", StringComparison.OrdinalIgnoreCase)) { // 修改RTE的内容,这里替换成你要插入的HTML文本 control.Value = "<p>我的新RTE内容,插入到Grid里的编辑器啦!</p>"; // 如果只需要修改第一个RTE,找到后可以break循环 // goto endLoop; // 或者用标志位跳出多层循环 } } } } } // endLoop: // 4. 将修改后的GridData序列化为JSON字符串 string updatedGridJson = JsonConvert.SerializeObject(gridData); // 5. 赋值回Grid属性并保存节点 contentNode.Properties["bodyTextGrid"].Value = updatedGridJson; contentService.Save(contentNode); } else { // 处理Grid还未配置内容的情况:如果需要初始化Grid结构,可以创建一个空的GridData并赋值 GridData emptyGrid = new GridData(); // 这里可以根据你的Grid预设结构初始化Sections/Rows/Areas/Controls // 比如添加一个包含RTE的默认布局 string emptyGridJson = JsonConvert.SerializeObject(emptyGrid); contentNode.Properties["bodyTextGrid"].Value = emptyGridJson; contentService.Save(contentNode); } }
关键注意事项
- 定位特定RTE:如果Grid里有多个RTE控件,你可以通过
control.Alias(控件的别名,在Grid配置里设置)来精准定位,而不是只判断editor alias。 - 命名空间依赖:确保引用了
Umbraco.Core.Models.Grid和Newtonsoft.Json(Umbraco 7默认已经包含这个库)。 - 前台读取场景:如果是在前台
IPublishedContent里操作,思路类似,不过前台的Grid可以用GetGridModel<T>()扩展方法直接获取GridData,修改后再序列化赋值(不过前台一般是读取,修改的话还是建议走后台服务)。
内容的提问来源于stack exchange,提问作者brother
相关产品推荐
相关产品推荐

