当模型状态无效时,CKEditor对其html内容进行编码时遇到问题。例如,如果我提交“ Hello World”,它将作为编码的html字符串<p>Hello World</p>
成功命中服务器。
如果我想加载内容,则将一个解码的html字符串作为值传递给textarea,它可以很好地加载<p>Hello World</p>
。但是,如果该页面发回,例如(!ModelState.IsValid)
,则该页面将错误地呈现为:
<p><p>Hello World</p></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;
}
}
}
答案 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文档滚动,事实证明这是一个简单的解决方案。很好,希望这一天有帮助。