如何在DynamicData项目中使用CKEditor?

时间:2012-06-07 07:44:14

标签: c# asp.net ckeditor asp.net-dynamic-data

我想在DynamicData网站上使用CKEditor。我找到的所有示例都是旧版本的CKEditor。

那么如何将CKEditor与asp.net dyamica数据网站集成?

非常感谢任何帮助。

IY

1 个答案:

答案 0 :(得分:4)

我所做的是修改动态数据 / FieldTemplates / 文件夹中的 MultilineText_Edit.ascx 文件+代码隐藏,如下所示。请注意,在我的示例中,您需要引用jQuery和CKEditor jQuery适配器,后者最有可能位于 /ckeditor/adapters/jquery.js 中。

我们的想法是使用ID为“ State ”的HiddenField控件作为数据的载体。请注意在重写的OnPreRender(...)中注册的客户端脚本:在任何.NET表单提交(此处由动态数据尝试保存,更新等触发)中,来自CKEditor的数据将保存到状态隐藏字段,数据通过被覆盖的ExtractValues(...) State 的FieldTemplate控件中提取。

澄清一下:不返回TextBox控件 Editor 的内容的原因是,它将返回控件的初始内容,放弃CKEditor更改。 CKEditor需要客户端将其标记和内容呈现给某个地方,因此我们对 State HiddenField执行此操作(对TextBox控件本身执行此操作会使事情变得混乱,据我记得。)

最后一件事:如果您希望保留 MultilineText_Edit.ascx 以进行正常的非CKEditor多行文字编辑,请将代码放在新文件中,例如: MultilineHtml_Edit.ascx 并在部分Linq2SQL类的元数据类中将属性的UIHint设置为“ MultilineHtml ”:

[UIHint("MultilineHtml")]
public string Description { get; set; }

<强> MultilineText_Edit.ascx

<%@ Control Language="C#" CodeBehind="MultilineText_Edit.ascx.cs" Inherits="MyProject.DynamicData.MultilineText_EditField" %>


<asp:TextBox ID="Editor" TextMode="MultiLine" runat="server" />
<asp:HiddenField ID="State" runat="server" />

<script type="text/javascript">
    $(document).ready(function () {
        $('#<%= Editor.ClientID %>').ckeditor(function () { }, { height: '400px' });
    });
</script>


<asp:RequiredFieldValidator runat="server" id="RequiredFieldValidator1" CssClass="DDControl DDValidator" ControlToValidate="Editor" Display="Static" Enabled="false" />
<asp:RegularExpressionValidator runat="server" ID="RegularExpressionValidator1" CssClass="DDControl DDValidator" ControlToValidate="Editor" Display="Static" Enabled="false" />
<asp:DynamicValidator runat="server" id="DynamicValidator1" CssClass="DDControl DDValidator" ControlToValidate="Editor" Display="Static" />

<强> MultilineText_Edit.ascx.cs

using System;
using System.Collections.Specialized;
using System.Web.UI;

namespace MyProject.DynamicData
{
    public partial class MultilineText_EditField : System.Web.DynamicData.FieldTemplateUserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Editor.MaxLength = Column.MaxLength;
            Editor.ToolTip = Column.Description;

            SetUpValidator(RequiredFieldValidator1);
            SetUpValidator(RegularExpressionValidator1);
            SetUpValidator(DynamicValidator1);
        }

        public override void DataBind()
        {
            Editor.Text = FieldValueEditString;

            base.DataBind();
        }

        protected override void OnPreRender(EventArgs e)
        {
            Page.ClientScript.RegisterOnSubmitStatement(
                this.GetType(),
                string.Format("kfckpb_{0}", this.ClientID),
                string.Format("$('#{0}').val($('#{1}').val());", State.ClientID, Editor.ClientID)
                );

            base.OnPreRender(e);
        }


        protected override void ExtractValues(IOrderedDictionary dictionary)
        {
            dictionary[Column.Name] = ConvertEditedValue(State.Value);
        }

        public override Control DataControl
        {
            get
            {
                return Editor;
            }
        }

    }
}