CK编辑器更改回发内容(4.10.1)

时间:2019-05-15 16:36:05

标签: javascript asp.net-mvc ckeditor wysiwyg ckeditor4.x

当模型状态无效时,CKEditor对其html内容进行编码时遇到问题。例如,如果我提交“ Hello World”,它将作为编码的html字符串<p>Hello World</p>成功命中服务器。

如果我想加载内容,则将一个解码的html字符串作为值传递给textarea,它可以很好地加载<p>Hello World</p>。但是,如果该页面发回,例如(!ModelState.IsValid),则该页面将错误地呈现为:

<p>&lt;p&gt;Hello World&lt;/p&gt;</p>

这是踢脚,它 仍然收到 <p>Hello World</p>作为回发中的字段值。有什么作用?

我正在使用以下来源:

const ckEditorSrc = "//cdn.ckeditor.com/4.10.1/standard/ckeditor.js";

和下面的初始化器:

CKEDITOR.replace('js-ck-editor', { htmlEncodeOutput: true});
CKEDITOR.config.height = 600;

我已经检查并在回发后点击了初始化程序。

唯一有用的信息是使用简单的loadScript函数动态加载源。

function loadScript(url, callback) {// loads a script onto a page
    var script = document.createElement("script");
    script.type = "text/javascript";
    if (script.readyState) {  //IE
        script.onreadystatechange = function () {
            if (script.readyState === "loaded" || script.readyState === "complete") {
                script.onreadystatechange = null;
                callback();
            }
        };
    } else {  //Others
        script.onload = function () {
            callback();
        };
    }

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

为简洁起见,这是完整的init函数:

var ckEditor = function () {// init ckeditor

    if ($('#js-ck-editor').length) {
        const ckEditorSrc = "//cdn.ckeditor.com/4.10.1/standard/ckeditor.js";
        loadScript(ckEditorSrc, function () {

            CKEDITOR.replace('js-ck-editor', { htmlEncodeOutput: true});
            CKEDITOR.config.height = 600;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

进行回发时,将填充ModelState。

@Html.TextAreaFor(x => x.Text)尝试解析此ModelState。它将解析为编码后的值,然后再次对其进行编码(两次)。

您可以在发布视图之前在发布操作中调用ModelState.Clear()

答案 1 :(得分:0)

因此,事实证明问题出在使用asp.net html帮助器。

我更改了@Html.TextAreaFor(m=>m.Text)

<textarea name="Text" id="js-ck-editor">@Model.Text</textarea>

现在可以正常工作了。经过数小时的ckeditor文档滚动,事实证明这是一个简单的解决方案。很好,希望这一天有帮助。