2

所以我在我的项目上安装了ckeditor。控件加载正常,您可以查看它。当您在 textarea 中键入内容时会发生错误。“下一步”按钮不起作用。如果文本区域中没有文本,则“下一步”按钮可以正常工作。当有文本并且您按下“下一步”按钮时,我也在浏览器中注意到这些错误。

编辑:请注意,这里的 View 是Partial View

浏览器中的错误

我正在使用ckeditor 3.6.4。我使用Nuget安装它。我有相应的文件。

在我的 _Shared/Layout 文件中,我包括以下内容:

<script type="text/javascript" src="@Url.Content("~/Scripts/ckeditor/ckeditor.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/ckeditor/adapters/jquery.js")"></script>

在我看来,我有以下几点:

@using (Ajax.BeginForm("SomeAction", "SomeController", new { id = Model.Id}, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "dynamicData", InsertionMode = InsertionMode.Replace }))
        {
            <div class="grid_6">
                @Html.TextAreaFor(x => x.SomeText, new { @class = "someTextArea" })
            </div>

            <div class="grid_6 alpha omega">
                <input type="submit" value="Next" class="grid_6 alpha omega button drop_4 gravity_5" />
            </div>
        }

在我的javascript中,我有以下内容:

<script type="text/javascript">
    $(function () {
        ReBindCKEditor();
    });

    function BindCKEditor() {
        var elem = $('#SomeText');
        elem.ckeditor(function () { }, { toolbar: [
        ['Source'],
        ['Preview'],
        ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Scayt'],
        ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'],
        ['Image', 'Table', 'HorizontalRule'],
        ['Styles', 'Format'],
        ['Bold', 'Italic', 'Strike'],
        ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', 'Blockquote'],
        ['Link', 'Unlink', 'Anchor']
        ]
        });
    }

    function ReBindCKEditor() {
        delete CKEDITOR.instances['SomeText'];
        BindCKEditor();
    }
</script>
4

2 回答 2

1

在提交之前,您需要更新 ckeditor 使用的隐藏文本字段。这可以通过

for ( instance in CKEDITOR.instances )
    CKEDITOR.instances[instance].updateElement();

假设您将其包装在一个名为BeforeSubmittingCKEditor遵循上述命名的javascript函数中,那么您可以将以下钩子添加到您的 BeginForm

OnBegin = "BeforeSubmittingCKEditor"

所以你的 AjaxOptions 看起来像这样:

new AjaxOptions { HttpMethod = "Post", 
                  UpdateTargetId = "dynamicData", 
                  InsertionMode = InsertionMode.Replace,
                  OnBegin = "BeforeSubmittingCKEditor" }
于 2012-10-15T07:59:50.047 回答
0

很可能(如果没有关于错误的更多详细信息,很难 100% 确定 - 错误响应的实际内容会有所帮助)您在这里遇到了“从客户端检测到潜在危险的 Request.Form 值”问题。默认情况下,ASP.NET MVC 框架在模型绑定期间检查请求,以确定它们是否包含作为 HTML 标记的潜在危险内容。如果检测到 HTML,模型绑定会引发错误。

有两种方法可以解决您的问题。首先AllowHtmlAttribute在服务器端的模型类中使用它:

...
[AllowHtml]
public string SomeText { get; set; }
...

第二种方法是在CKEditor中使用htmlEncodeOutput以下选项启用客户端输出编码:

function BindCKEditor() {
    var elem = $('#SomeText');
    elem.ckeditor(function () { }, {
        htmlEncodeOutput: true,
        toolbar: [
            ['Source'],
            ['Preview'],
            ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Scayt'],
            ['Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'],
            ['Image', 'Table', 'HorizontalRule'],
            ['Styles', 'Format'],
            ['Bold', 'Italic', 'Strike'],
            ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', 'Blockquote'],
            ['Link', 'Unlink', 'Anchor']
        ]
    });
}

要进行更详细的分析,我们需要查看完整的错误消息。

于 2012-10-15T08:23:01.040 回答