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

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模型,我们需要:

  1. 读取Grid属性的JSON字符串并反序列化为GridData对象
  2. 遍历Grid的Sections → Rows → Areas → Controls,找到类型为RTE的控件
  3. 修改该控件的HTML内容
  4. 将修改后的GridData序列化为JSON字符串,重新赋值给Grid属性
  5. 保存内容节点

代码实现示例(后台操作场景)

假设你是在后台通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:07