开源Blazor组件 > wangEditor富文本编辑器


Blazor其实也是支持与js进行互动的,互动方式也相当的简单,只是有些东西并没有csharp版本的实现,比如富文本编辑器,代码高亮这些,现在流行的都是js版本,所以在blazor中使用时就不得不与js互动,联合完成任务,但是其中要注意的时,如果页面修改了,会触发blazor的页面更新机制,会导致js的代码高亮等与blazor框架冲突,为了解决这些问题,必须要通过blazor调用js更新页面这种方式,代码如下:
wangEditor的官网是:https://www.wangeditor.com/ 这是一个国内的人开发的富文本编辑器,目前blazor中没什么富文本编辑器,有国外的人用gedit做了blazor组件,但是用起来用js奔溃的bug一直都没修复,其他的框架中有,但是需要使用一整套其他的框架,而mudblazor中并没有富文本编辑器,所以不得不自己找一个,再做成组件。代码如下

        @using System.Net;
        @using Microsoft.AspNetCore.Components.Forms;
        @layout MainLayout
        @inject IJSRuntime JsRuntime

        <MudPaper Elevation="5" Class="py-5 px-2 ma-2">
            <MudToolBar Style="@Theme.GetStyle()">
                <MudTooltip Text="保存" Color="Color.Success" Placement="Placement.Top" Arrow="true">
                    <MudIconButton Icon="@Icons.Material.Filled.SaveAs" Color="Color.Success" OnClick="SaveHtml"></<MudIconButton>
                </<MudTooltip>
            </<MudToolBar>
            <div id="zmjedit">
                @(new MarkupString(CurrentNote.HtmlContent ?? "<a href=\"http://BlazorHelpWebsite.com\">help</<a>"))
            </<div>
            <textarea id="zmjtextout" style="display: none;opacity:0;"></<textarea>
        </MudPaper>
        <MudPaper Elevation="5" Class="py-5 px-2 ma-2">
            <textarea id="zmjtextin" style="width:100%;height:180px;"></<textarea>
        </<MudPaper>

        @code {
            /// <summary>
            /// 保存当前的编辑结果
            /// </<summary>
            private void SaveHtml()
            {
                JsRuntime.InvokeAsync<string>("GetEditHtml").AsTask().ContinueWith(t =>
                {
                    var msg = "保存成功!";
                    try
                    {
                        t.Result//保存到数据库
                    }
                    catch (Exception ex)
                    {
                        msg = ex.InnerException?.Message ?? ex.Message;
                    }
                    this.InvokeAsync(() => DialogService.ShowMessageBox("提示", msg));
                });
            }
            /// <summary>
            /// 保存当前的content内容
            /// </<summary>
            private void SaveHtmlContent()
            {
                var msg = "保存成功!";
                try
                {
                    //保存到数据库
                }
                catch (Exception ex)
                {
                    msg = ex.InnerException?.Message ?? ex.Message;
                }
                DialogService.ShowMessageBox("提示", msg);
            }
            /// <summary>
            /// 初始化note编辑器
            /// </<summary>
            /// <param name="firstRender"></<param>
            protected override async Task OnAfterRenderAsync(bool firstRender)
            {
                await base.OnAfterRenderAsync(firstRender);
                if (!firstRender) return;
                await JsRuntime.InvokeVoidAsync("import", "//www.unpkg.com/wangeditor/dist/wangEditor.min.js");
                await JsRuntime.InvokeVoidAsync("import", "/script/zmjscript.js");
                await JsRuntime.InvokeVoidAsync("InitWangEditor", "zmjedit", "zmjtextout", "zmjtextin");
            }
        }
    
然后再写一个js代码放在wwwroot文件夹下的某个位置,代码如下:

        window.InitWangEditor = function (srccontext, editcontext, newedit) {//初始化wangeditor部分
            const E = window.wangEditor;
            const editor = new E('#' + srccontext);
            // 或者 const editor = new E( document.getElementById('div1') )
            editor.config.height = 800;
            editor.config.zIndex = 500;
            const $formtextarea = $('#' + editcontext);
            editor.config.onchange = function (html) {
                // 第二步,监控变化,同步更新到 textarea
                $formtextarea.val(encodeURI(html))
            }// 第一步,初始化 textarea 的值
            $formtextarea.val(encodeURI(editor.txt.html()));
            $("#" + newedit)[0].onchange = function () {
                let h = this.value
                console.log(h)
                $formtextarea.val(encodeURI(h))
                editor.txt.html(h)
            }
            // 配置 server 接口地址
            editor.config.uploadImgServer = "/上传图片的url地址";
            //关闭样式过滤。
            //editor.config.pasteFilterStyle = false;
            try {
                // 挂载highlight插件
                //hljs.highlightAll();//srccontext是被编辑的原文div的id,editcontext是输出对象比如texteare的id,uploadurl是上传图片的api的url
                editor.highlight = hljs;
            } catch { }
            editor.create();
            window.ZmjHtmlEditor = editor;
        }
        window.GetEditHtml = function () {//获取正在编辑的html内容
            try {
                return window.ZmjHtmlEditor.txt.html();
            } catch {
                return "";
            }
        }
    
在需要富文本编辑器的组件或者页面中直接嵌入以上代码即可。