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

Blazor中contenteditable div数据绑定问题求解决方案

解决Blazor中contenteditable div双向绑定失效问题及替代控件推荐

问题背景

已知Blazor原生不支持contenteditable div的数据绑定,目前已通过oninput事件结合JS代码实现输入文本的获取,但无法通过更新TODO_TEXT来同步div的显示内容。现有代码如下:

现有Blazor代码

<div role="textbox" contentEditable="true" @oninput="(e) => HandleInput(e, item.TODO_ID)">@item.TODO_TEXT</div>

配套JS代码

document.addEventListener("input", onInput);
function onInput(e) { 
    let target = e.target; 
    if (target.localName == "div") { 
        if (!target.value && !target.__contenteditable) target.__contenteditable = true; 
        if (target.__contenteditable) target.value = target.innerText; 
    }
}

可行解决方案:完善双向绑定逻辑

由于contenteditable会干扰Blazor的DOM diff机制,直接更新TODO_TEXT无法触发div内容刷新,需通过JSInterop配合手动同步:

1. 更新JS代码,添加主动更新方法

扩展原有JS逻辑,新增用于从C#端同步div内容的方法:

document.addEventListener("input", onInput);

function onInput(e) {
    let target = e.target;
    if (target.localName === "div" && target.isContentEditable) {
        if (!target.__contenteditable) {
            target.__contenteditable = true;
        }
        target.value = target.innerText;
    }
}

// 用于从C#更新contenteditable div的内容
window.updateContentEditable = (elementId, text) => {
    const element = document.getElementById(elementId);
    if (element && element.isContentEditable) {
        element.innerText = text;
        element.value = text;
        element.__contenteditable = true;
    }
};

2. 调整Blazor组件代码

给div添加唯一ID,方便JS定位,并修改输入处理逻辑:

@inject IJSRuntime JSRuntime

<div id="todo-@item.TODO_ID" role="textbox" contentEditable="true" @oninput="(e) => HandleInput(e, item)"></div>

3. 实现输入处理与主动同步

// 处理输入事件,更新TODO_TEXT
private void HandleInput(ChangeEventArgs e, TodoItem item)
{
    var newText = e.Value?.ToString();
    if (!string.IsNullOrEmpty(newText))
    {
        item.TODO_TEXT = newText;
        // 可选:添加保存到后端的逻辑
    }
}

// 当需要主动更新div内容时(比如从后端刷新数据)
private async Task RefreshTodoText(TodoItem item)
{
    // 假设此处已从后端获取最新的TODO_TEXT并赋值给item.TODO_TEXT
    await JSRuntime.InvokeVoidAsync("updateContentEditable", $"todo-{item.TODO_ID}", item.TODO_TEXT);
}

支持标记文本的替代控件推荐

如果需要更完善的富文本/标记文本编辑能力,推荐以下成熟的Blazor控件:

  • Blazored.TextEditor:基于Quill.js的轻量封装,支持双向绑定,自带常用格式化工具(加粗、斜体、列表等),开源免费。
  • Radzen Blazor Editor:开源富文本编辑器,集成简单,提供预设工具条,支持自定义格式,适配Blazor Server/WASM。
  • Syncfusion Blazor RichTextEditor:功能全面,支持图片上传、自定义工具栏、代码块等,适合复杂编辑场景(注意商业授权限制)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:22:48