zoukankan      html  css  js  c++  java
  • asp.net mvc中ckeditor+ckfinder的配置方法(1)

    开源网页编辑软件FCKEditor在09年发布更新到3.0,并改名为CKEditor。改进后的ckeditor更加模块话,配置更加灵活,和以前的fckeditor使用方式上也有所不同。在我的mvc项目中由于要用到 ckeditor,特意研究了下它的使用方法,写下来和大家分享。

    我用的是最新版本的:ckeditor_3.0.1  下载地址:http://ckeditor.com/

    下载后直接解压得到ckeditor文件夹,包括如下内容:

     其中sample为例子,source为源文件,为了减少editor的体积,直接删除。然后将整个文件夹直接拷贝到网站的根目录下.

     在你需要使用editor控件的页面头部添加:

    <head>
    ...
    <script type="text/javascript" src="/ckeditor/ckeditor.js"></script>
    </head>

    在页面相应位置上添加:
    <textarea name="editor1"></textarea>
    <script type="text/javascript">
    window.onload = function()
    {
    CKEDITOR.replace( 'editor1' );
    };
    </script>
    注意:js代码一定要写在textarea后
    其实可以这样理解editor控件只是对textarea做了一个漂亮的包装,我们的输入其实都在上面的texarea中,最终也是通过textarea
    提交到服务器端。

    知道这些,服务器端代码就太简单了:
    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(false)]
    public ActionResult Create(FormCollection collection)
    {
    blog.Content = collection["editor1"];
    。。。
    }
    collection["editor1"]即可取得editor中的输入。这里需要注意的是由于textarea中有特殊字符,出于
    安全原因,默认情况mvc框架不允许提交的,应在相应方法上加上[ValidateInput(false)]属性。效果如下:


    还是相当不错的。

    新的editor中去除了上传功能,也就是说我们不能通过上传插入图片、flash了。如图:editor中的插入图片对话框并没有提供上传功能:


    幸好有个插件ckfinder可以辅助我们完成以下功能,插件的下载地址同样在
    http://ckeditor.com/ 最新版本:ckfinder_aspnet_1.4.1.1
    解压后,得到一个名为ckfinder的文件夹,同样删除掉source、sample目录(原因同上),拷贝到网站根目录下。如图:

    注意:这里还有些配置必须要做:
    • 把文件夹中的bin目录下的dll文件添加到网站的引用中,防止出现找不到类的错误。
    • 打开config.ascx,修改public override bool CheckAuthentication()
          {
             reture false;//改为return true;
          }此处修改是为了有权限上传。


    接下来就要把ckfinder集成到ckeditor中了,代码如下:
    var editor = CKEDITOR.replace('editor1');
    CKFinder.SetupCKEditor(editor, '/ckfinder/');

    当然,在页面相应位置引用script代码是必不可少的。
    <script type="text/javascript" src="/ckfinder/ckfinder.js"></script>

    好了,最后一步了,由于ckfinder不是免费的,所以默认情况下会在上传页面中有红色的广告提示,虽然不影响使用,但总是觉得
    不爽。
    去除方法如下:找到ckfinder/core/js/ckfinder_ie.js及ckfinder_gecko.js,将其中的en.call(window,qo);    代码注释或直接删除。

    至此我们的ckfinder全部配置完毕,运行效果如下:



    补充:
    要自己配置eidtor的外观,可打开eidtor文件夹下的:config.js文件进行配置。
    CKEDITOR.editorConfig = function( config )
    {
    // Define changes to default configuration here. For example:
    // config.language = 'fr';
    // config.uiColor = '#AADC6E';

    // config.width = 200;
    };
    此处配置是针对网站中所有页面的editor,如单个页面需要单独配置,直接在页面中写配置代码,示例如下:
    CKEDITOR.config.height = 400;

     

    工作进展有点慢,但我没偷懒。只是有些东西没有接触过,所以要慢慢摸索。总的来说,是缺乏经验。

    下午好像发现了jquery的一个不足之处,也不知道是不是我自己的原因。我在div里面放了一个tableMain,然后在tableMain里再嵌套了一个tableData。当我使用jquery$(“#td_1”).className=”td_sel”时,发现$(“#td_1”)返回的是underfined。而使用document.getElementById(“td_1”) .className=”td_sel”,则一切正常。【注:此问题请关注4楼及5楼回复】

    今天做到了文章发布这个模块,重点是设置编辑器。在网上搜索了一下fckeditor,结果出来好多条信息都说fckeditor已经升级为ckeditor,一时还不相信,以为是ckeditor在借fckeditor炒作,后来,当我看到“http://fckeditor.net/的域名已经转向http://ckeditor.com/”时,才相信这是真的。

    下载了最新版的CKEditor 3.0.1,这是我的个人习惯,在条件允许的前提下,一切都要用最新版的。

    按照http://ckeditor.com.cn/docs/的提示,在网页上配置好了CKEditor,在浏览器中查看,感觉CKEditor的界面确实非常美观,可当我兴高采烈的想要尝试一下图片上传功能时,却没有看到上传图片的按钮。

    继续在网上搜索,结论是“CKEditor 本身不具备上传功能,需要集成 CKFinder 才能实现上传功能”。我最讨厌带插件的东西了,但目前的情形下,我只能选择忍。然后告诉自己:不就是集成一个插件吗?那就集成吧。

    接着下载了CKFinder 1.4.1.1 for Asp.net,解压后,将ckfinder文件夹放到项目根目录下——因为网上的很多资料都说,最好把CKEditorCKFinder放在同一级目录下。而这样一来,我们的项目里就会平白无故的多出两个文件夹来。我本人是有代码洁癖的,我觉得,留一个文件夹,以示对作者的尊重,这样就足够了。要留两个,会让我觉得很不舒服。

    下载完之后就下班了,剩下的是回到家里吃了晚饭之后做的。

    在将CKFinder集成到CKEditor之前,我们还要对CKFinder进行一些配置。聪明的朋友应该很容易想到,既然是上传文件的插件,要配置的东西多半是上传文件的路径。

    CKFinder默认的上传路径是在其本身目录下的userfiles文件夹,不过,我已经将CKFinder放到CKEditor文件夹里了,要是把图片再存放到userfiles里面,系统就得绕过三层文件夹去找文件或图片了,于是,我打算将图片上传到项目根目录下的upFile文件夹里。要实现这一功能,需要修改CKFinder下的config.ascx文件,将BaseUrl = "/ckfinder/userfiles/"修改为BaseUrl = "~/upFile/"。然后,将CKFinder/bin文件夹下的CKFinder.dll文件剪切到系统项目的bin文件夹里。或者通过添加引用的方式,将CKFinder.dll引入到项目中。接下来,我们就可以使用带有文件上传功能的CKEditor了:

    CKFinder文件夹放到CKEditor文件夹内,在页面中,引入两者的js文件:

    <script src="http://www.cnblogs.com/ckeditor/ckeditor.js" type="text/javascript"></script>

    <script src="http://www.cnblogs.com/ckeditor/ckfinder/ckfinder.js" type="text/javascript"></script>

    至于将编辑器引用到控件上,网上有如下两种方法:

    一是使用客户端控件textarea


    <textarea rows="20" cols="40" name="txtContent" id="txtContent"></textarea>

    <script type="text/javascript">

    var editor = CKEDITOR.replace('txtContent');

    CKFinder.SetupCKEditor(editor, 
    'http://www.cnblogs.com/ckeditor/ckfinder/'); 

    </script>

    二是使用服务器端控件textbox

    Code

    个人觉得,既然是asp.net的程序,那就用服务器端的控件吧。尽管运行效率比客户端控件要慢一点,但开发效率要快一些。而且,作为程序员,我们总是喜欢是尝试所有的可能性,然后再选择自己喜欢的那一种。

    其实,这里也可以不使用Text='<%# Bind("info") %>'来对控件进行赋值,直接在后置代码中使用 

    this.txtContent.Text=”初始值”

        也是可以的。取值的时候,也可以直接使用如下代码:

     CKFinderCKEditor 的代码。当我直接运行带有编辑器的页面时,编译器提示如下错误:

    string content= this.txtContent.Text

        注意:TextMode="MultiLine"属性必不可少,否则取到的将是空值。

    在调试程序之前,我没有精简

    命名空间“System.Web.UI.Design”中不存在类型或命名空间名称“ControlDesigner(是缺少程序集引用吗?)

    出错的地方在ckeditor\ckfinder\_source\FileBrowserDesigner.cs的第19行,于是,索性把文件精简一下:

    第一步,精简ckeditor :将 _samples_source 文件夹删除,lang 目录下可以只保留en.jszh.jszh-cn.js 三个语言文件;

    第二步,精简ckfinder:将 _samples_source 文件夹删除,lang 目录下可以只保留en.jszh.jszh-cn.js 三个语言文件。

    这里请注意js代码的第二行:CKFinder.SetupCKEditor(editor, 'http://www.cnblogs.com/ckeditor/ckfinder/');这里的“http://www.cnblogs.com/ckeditor/ckfinder/”是ckfinder与当前页面的相对路径,请大家不要直接复制粘贴代码,否则在上传图片时,可能会出现如下错误:

    说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。 

     请求的URL:  /admin/ckeditor/ckfinder/core/connector/aspx/connector.aspx

    所以,如果您不想同我一样把ckfinder放到ckeditor文件夹里,那也没关系,只要你在这里把路径修改填写正确就可以了。

    我以为这样就算是做完了所有的工作了,但当我上传图片时,却又弹出了如下的提示信息:

    因为安全原因,文件不可浏览. 请联系系统管理员并检查CKFinder配置文件。

    没办法呀,俗话说,好事多磨。我又只能去请教最好的老师——百度了。复制上面的提示信息到百度搜索框,回车后找到了一条关于PHP整合ckeditor的帖子,对比了一下,抱着试一试的心态,居然把这样问题解决了。方法是这样的:

    修改CKFinder下的config.ascx文件,将public override bool CheckAuthentication()函数的返回值由return false修改为return true

    再次测试,图片上传成功!

     

    摘自 网络

    相关补充:

    使用方法:
    一.引用js脚本
    <script src="/Content/ckeditor_3.4/ckeditor.js" type="text/javascript"></script>
    <script src="/Content/ckfinder_aspnet_2.0.1/ckfinder.js" type="text/javascript"></script>

    二.调用ckeditor:使用class方法调用ckeditor
    <%=html.textarea("content", new="" style="98%;height:300px;" class="ckeditor">

    三.在ckeditor中集成ckfinder:在ckeditor的config中添加

    //在 CKEditor 中集成 CKFinder,注意 ckfinder 的路径选择要正确。
        var ckfinderPath = "/Content/ckfinder_aspnet_2.0.1"; //ckfinder路径
        config.filebrowserBrowseUrl = ckfinderPath + '/ckfinder.html';
        config.filebrowserImageBrowseUrl = ckfinderPath + '/ckfinder.html?type=Images';
        config.filebrowserFlashBrowseUrl = ckfinderPath + '/ckfinder.html?type=Flash';
        config.filebrowserUploadUrl = ckfinderPath + '/core/connector/aspx/connector.aspx?command=QuickUpload&type=Files';
        config.filebrowserImageUploadUrl = ckfinderPath + '/core/connector/aspx/connector.aspx?command=QuickUpload&type=Images';
        config.filebrowserFlashUploadUrl = ckfinderPath + '/core/connector/aspx/connector.aspx?command=QuickUpload&type=Flash';

    四.取消ckfinder上传文件验证

     public override bool CheckAuthentication()
     {
      // WARNING : DO NOT simply return "true". By doing so, you are allowing
      // "anyone" to upload and list the files in your server. You must implement
      // some kind of session validation here. Even something very simple as...
      //
      //  return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );    //自动设置的授权用户确认,在授权用户登录之后添加Session["IsAuthorized"]==true
      //
      // ... where Session[ "IsAuthorized" ] is set to "true" as soon as the
      // user logs on your system.

      //return false; 也可直接改为true,若有必要,自行添加验证   
      return true;   

      }

    为了安全性的考虑可以在这里加入用户验证,根据用户权限,确定是否有权限上传文件.

    解决方法很简单就是在用户登录时加入是否可上传文件的Session标志。其实Fckeditor已经写好了。直接把验证函数CheckAuthentication()中的注释段中

    return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );

    注释去掉。在登录成功加入Session[IsAuthorized] = true;就可以了。

    (非必要)五.修改上传文件名

    修改ckfinder的源代码,找到Connector\CommandHandlers\FileUploadCommandHandler.cs这个文件,定位到:csharp 代码

    string sExtension = System.IO.Path.GetExtension( oFile.FileName );
    sExtension = sExtension.TrimStart( '.' );

    在下面加一行代码:
    sFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + sExtension;

  • 相关阅读:
    BOS项目 第1天(项目概述、PowerDesigner、svn、easyui的使用)
    mavenbos项目第二天(msyql操作、ssh配置集成、PowerDesinger、自定义登陆拦截器)
    mavenbos项目第一天(maven、远程部署、svn、easyui的使用。)
    json字符串和java对象的互相转换
    mysql设置环境变量
    windows下mysql的安装
    Unity3d 创建线程 子线程与主线程通信
    Unity3d 子线程能做的事
    Unity3d Resources TextAsset 文本
    NGUI Checkbox与PlayerPrefs
  • 原文地址:https://www.cnblogs.com/lushuicongsheng/p/2041695.html
Copyright © 2011-2022 走看看