在 ASP.NET MVC 3 中应用 KindEditor

http://www.cnblogs.com/weicong/archive/2012/03/31/2427608.html

第一步

将 KindEditor 的源文件添加到项目中,建议放到 /Scripts/kindeditor 目录中,其中只需要有 lang目录、plugis目录、themes目录和kindeditor-min.js文件即可。

image

第二步

在 /Views/Shared/EditorTemplates 目录中添加一个分部视图“kindeditor.cshtml”(文件名可任意)。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script type="text/javascript" src="http://mce_host/weicong/admin/@Url.Content("></script>
<script type="text/javascript" src="http://mce_host/weicong/admin/@Url.Content("></script>
<script type="text/javascript">// <![CDATA[
    (function () {
        KindEditor.ready(function (k) {
            k.create("#@ViewData.TemplateInfo.GetFullHtmlFieldName(string.Empty)", {
                themeType: 'default',
                width: '690px',
                height: '400px',
                uploadJson: '/KindEditorHandler/Upload',
                allowFileManager: true,
                fileManagerJson: '/KindEditorHandler/FileManager'
            });
        });
    })();
// ]]></script>
@Html.TextArea(string.Empty, ViewData.TemplateInfo.FormattedModelValue)

第三步

在需要应用编辑器的Model属性中设置 DataAnnotations,比如:

1
2
3
4
[DisplayName("正文")]
[AllowHtml]
[UIHint("kindeditor")] // EditorTemplates 目录中添加的视图名称
public object Content { get; set; }

第四步

在视图中使用 @Html.EditorFor(model => model.Content) 即可加载编辑器。

附 KindEditorHandlerController 源码

复制代码
  1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Globalization;
5 using System.IO;
6 using System.Text.RegularExpressions;
7 using System.Web.Mvc;
8
9 namespace KwDoctorCourse.Controllers
10 {
11 public class KindEditorHandlerController : Controller
12 {
13 //文件保存目录路径
14 const string SavePath = "/uploadfile/";
15
16 #region uploadJson
17
18 //
19 // GET: /KindEditorHandler/Upload
20
21 public ActionResult Upload()
22 {
23 文件保存目录路径
24 //const string savePath = "/Content/Uploads/";
25
26 //文件保存目录URL
27 var saveUrl = SavePath;
28
29 //定义允许上传的文件扩展名
30 var extTable = new Hashtable
31 {
32 {"image", "gif,jpg,jpeg,png,bmp"},
33 {"flash", "swf,flv"},
34 {"media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb"},
35 {"file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"}
36 };
37
38 //最大文件大小
39 const int maxSize = 2000000;
40
41 var imgFile = Request.Files["imgFile"];
42
43 if (imgFile == null)
44 {
45 return ShowError("请选择文件。");
46 }
47
48 var dirPath = Server.MapPath(SavePath);
49 if (!Directory.Exists(dirPath))
50 {
51 //return ShowError("上传目录不存在。" + dirPath);
52 Directory.CreateDirectory(dirPath);
53 }
54
55 var dirName = Request.QueryString["dir"];
56 if (String.IsNullOrEmpty(dirName))
57 {
58 dirName = "image";
59 }
60
61 if (!extTable.ContainsKey(dirName))
62 {
63 return ShowError("目录名不正确。");
64 }
65
66 var fileName = imgFile.FileName;
67 var extension = Path.GetExtension(fileName);
68 if (extension == null)
69 {
70 return ShowError("extension == null");
71 }
72
73 var fileExt = extension.ToLower();
74
75 if (imgFile.InputStream == null || imgFile.InputStream.Length > maxSize)
76 {
77 return ShowError("上传文件大小超过限制。");
78 }
79
80 if (String.IsNullOrEmpty(fileExt) ||
81 Array.IndexOf(((String)extTable[dirName]).Split(','), fileExt.Substring(1).ToLower()) == -1)
82 {
83 return ShowError("上传文件扩展名是不允许的扩展名。\n只允许" + ((String)extTable[dirName]) + "格式。");
84 }
85
86 //创建文件夹
87 dirPath += dirName + "/";
88 saveUrl += dirName + "/";
89 if (!Directory.Exists(dirPath))
90 {
91 Directory.CreateDirectory(dirPath);
92 }
93 var ymd = DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo);
94 dirPath += ymd + "/";
95 saveUrl += ymd + "/";
96 if (!Directory.Exists(dirPath))
97 {
98 Directory.CreateDirectory(dirPath);
99 }
100
101 var newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
102 var filePath = dirPath + newFileName;
103
104 imgFile.SaveAs(filePath);
105
106 var fileUrl = saveUrl + newFileName;
107
108 var hash = new Hashtable();
109 hash["error"] = 0;
110 hash["url"] = fileUrl;
111
112 return Json(hash, "text/html;charset=UTF-8");
113 }
114
115 private JsonResult ShowError(string message)
116 {
117 var hash = new Hashtable();
118 hash["error"] = 1;
119 hash["message"] = message;
120
121 return Json(hash, "text/html;charset=UTF-8");
122 }
123
124 #endregion
125
126 #region fileManagerJson
127
128 //
129 // GET: /KindEditorHandler/FileManager
130
131 public ActionResult FileManager()
132 {
133 根目录路径,相对路径
134 //String rootPath = "/Content/Uploads/";
135
136 //根目录URL,可以指定绝对路径,比如 http://www.yoursite.com/attached/
137 var rootUrl = SavePath;
138
139 //图片扩展名
140 const string fileTypes = "gif,jpg,jpeg,png,bmp";
141
142 String currentPath;
143 String currentUrl;
144 String currentDirPath ;
145 String moveupDirPath ;
146
147 var dirPath = Server.MapPath(SavePath);
148 var dirName = Request.QueryString["dir"];
149 if (!String.IsNullOrEmpty(dirName))
150 {
151 if (Array.IndexOf("image,flash,media,file".Split(','), dirName) == -1)
152 {
153 return Content("Invalid Directory name.");
154 }
155 dirPath += dirName + "/";
156 rootUrl += dirName + "/";
157 if (!Directory.Exists(dirPath))
158 {
159 Directory.CreateDirectory(dirPath);
160 }
161 }
162
163 //根据path参数,设置各路径和URL
164 var path = Request.QueryString["path"];
165 path = String.IsNullOrEmpty(path) ? "" : path;
166 if (path == "")
167 {
168 currentPath = dirPath;
169 currentUrl = rootUrl;
170 currentDirPath = "";
171 moveupDirPath = "";
172 }
173 else
174 {
175 currentPath = dirPath + path;
176 currentUrl = rootUrl + path;
177 currentDirPath = path;
178 moveupDirPath = Regex.Replace(currentDirPath, @"(.*?)[^\/]+\/$", "$1");
179 }
180
181 //排序形式,name or size or type
182 String order = Request.QueryString["order"];
183 order = String.IsNullOrEmpty(order) ? "" : order.ToLower();
184
185 //不允许使用..移动到上一级目录
186 if (Regex.IsMatch(path, @"\.\."))
187 {
188 return Content("Access is not allowed.");
189 }
190
191 //最后一个字符不是/
192 if (path != "" && !path.EndsWith("/"))
193 {
194 return Content("Parameter is not valid.");
195 }
196 //目录不存在或不是目录
197 if (!Directory.Exists(currentPath))
198 {
199 return Content("Directory does not exist.");
200 }
201
202 //遍历目录取得文件信息
203 string[] dirList = Directory.GetDirectories(currentPath);
204 string[] fileList = Directory.GetFiles(currentPath);
205
206 switch (order)
207 {
208 case "size":
209 Array.Sort(dirList, new NameSorter());
210 Array.Sort(fileList, new SizeSorter());
211 break;
212 case "type":
213 Array.Sort(dirList, new NameSorter());
214 Array.Sort(fileList, new TypeSorter());
215 break;
216 default:
217 Array.Sort(dirList, new NameSorter());
218 Array.Sort(fileList, new NameSorter());
219 break;
220 }
221
222 var result = new Hashtable();
223 result["moveup_dir_path"] = moveupDirPath;
224 result["current_dir_path"] = currentDirPath;
225 result["current_url"] = currentUrl;
226 result["total_count"] = dirList.Length + fileList.Length;
227 var dirFileList = new List<Hashtable>();
228 result["file_list"] = dirFileList;
229 foreach (var t in dirList)
230 {
231 var dir = new DirectoryInfo(t);
232 var hash = new Hashtable();
233 hash["is_dir"] = true;
234 hash["has_file"] = (dir.GetFileSystemInfos().Length > 0);
235 hash["filesize"] = 0;
236 hash["is_photo"] = false;
237 hash["filetype"] = "";
238 hash["filename"] = dir.Name;
239 hash["datetime"] = dir.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
240 dirFileList.Add(hash);
241 }
242 foreach (var t in fileList)
243 {
244 var file = new FileInfo(t);
245 var hash = new Hashtable();
246 hash["is_dir"] = false;
247 hash["has_file"] = false;
248 hash["filesize"] = file.Length;
249 hash["is_photo"] = (Array.IndexOf(fileTypes.Split(','), file.Extension.Substring(1).ToLower()) >= 0);
250 hash["filetype"] = file.Extension.Substring(1);
251 hash["filename"] = file.Name;
252 hash["datetime"] = file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
253 dirFileList.Add(hash);
254 }
255
256 return Json(result, "text/html;charset=UTF-8", JsonRequestBehavior.AllowGet);
257 }
258
259
260 private class NameSorter : IComparer
261 {
262 public int Compare(object x, object y)
263 {
264 if (x == null && y == null)
265 {
266 return 0;
267 }
268 if (x == null)
269 {
270 return -1;
271 }
272 if (y == null)
273 {
274 return 1;
275 }
276 var xInfo = new FileInfo(x.ToString());
277 var yInfo = new FileInfo(y.ToString());
278
279 return String.CompareOrdinal(xInfo.FullName, yInfo.FullName);
280 }
281 }
282
283 private class SizeSorter : IComparer
284 {
285 public int Compare(object x, object y)
286 {
287 if (x == null && y == null)
288 {
289 return 0;
290 }
291 if (x == null)
292 {
293 return -1;
294 }
295 if (y == null)
296 {
297 return 1;
298 }
299 var xInfo = new FileInfo(x.ToString());
300 var yInfo = new FileInfo(y.ToString());
301
302 return xInfo.Length.CompareTo(yInfo.Length);
303 }
304 }
305
306 private class TypeSorter : IComparer
307 {
308 public int Compare(object x, object y)
309 {
310 if (x == null && y == null)
311 {
312 return 0;
313 }
314 if (x == null)
315 {
316 return -1;
317 }
318 if (y == null)
319 {
320 return 1;
321 }
322 var xInfo = new FileInfo(x.ToString());
323 var yInfo = new FileInfo(y.ToString());
324
325 return String.CompareOrdinal(xInfo.Extension, yInfo.Extension);
326 }
327 }
328
329 #endregion
330 }
331 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈https(创建、传输、断开)

前言 比起http&#xff0c;https是更安全的&#xff0c;传输过程中加密的。但是具体的加密过程是怎么样我一直一知半解。花了点时间抓包简单分析了一下&#xff0c;希望对大家有用。 在windows平台下抓tcp包是用wireshark的了。没啥好说的。   我们平常的一次https 的请求&am…

oracle 还原dmp时_报错的值太大,基于oracle数据库的CLOUD备份恢复测试

CLOUD oracle数据库备份恢复测试强烈建议使用expdp/impdp&#xff0c;因为&#xff1a;在expdp的时候Oracle不会再依赖和参考NLS_LANG的设置&#xff0c;而是完全按照数据库本身的字符集导出数据&#xff0c;impdp的时候&#xff0c;Oracle会自动判断如果dmp文件中的字符集和目…

Servlet读取文件的最好的方式

在java web 开发的时候不可避免的会读取文本信息&#xff0c;但是方式不同&#xff0c;所付出的代价也是不一样的&#xff0c;今天学到了一个比较好的实用性的技巧&#xff0c;拿来与大家分享一下。 读取属性配置文件 之所以说成是读取属性&#xff08;properties)文件&#xf…

Bootstrap 排版

2019独角兽企业重金招聘Python工程师标准>>> Bootstrap 使用 Helvetica Neue、 Helvetica、 Arial 和 sans-serif 作为其默认的字体栈。 使用 Bootstrap 的排版特性&#xff0c;您可以创建标题、段落、列表及其他内联元素。 标题 Bootstrap 中定义了所有的 HTML 标题…

php读取子目录下文件内容,php小代码----目录下读取子文件或子目录_PHP教程

php小代码----目录下读取子文件或子目录rootPath $rootPath;if (is_dir($this->rootPath)) {$this->rootPath pathinfo($this->rootPath, PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR . pathinfo($this->rootPath, PATHINFO_BASENAME);$this->opDirectory dir(…

博客园自动显示随笔标签

title: 博客园自动显示随笔标签 date: 2018-01-03 20:52:22 tags: 浏览器脚本 categories: 前端 在添加随笔页自动显示已有标签&#xff0c;不用点击插入已有标签 效果如图 安装链接https://greasyfork.org/zh-CN/scripts/36809-%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%98%BE%E7%A4%BA…

linux 进程代码,怎样从Linux终端管理进程:10个你必须知道的命令

Linux终端有一系列有用的命令。它们可以显示正在运行的进程、杀死进程和改变进程的优先级。本文列举了一些经典传统的命令和一些有用新颖的命令。本文提到的命令会实现某个单一功能。它们可以结合起来——这也是Unix设计程序的理念。其它命令&#xff0c;例如htop,会在命令的上…

pycharm 安装 tensorflow

1. 安装python 3.5 链接&#xff1a;https://www.python.org/downloads/release/python-352/ 1.1如果之前安装了其他版本的&#xff0c;可以在你需要的项目中&#xff0c;导入本地需要的解释器 如果遇到安装包不知道安装位置&#xff0c;在C盘中搜索&#xff0c;然后将python3…

linux vnc 改端口号,RHEL6下配置vncserver服务(包括修改vnc端口)

RHEL6下配置vncserver服务(包括修改vnc端口)(2012-04-13 23:36:07)标签&#xff1a;it配置完vsftpd后&#xff0c;还必须要开的服务就是vnc啦&#xff0c;首先&#xff0c;在root用户下利用yum源安装vncserver:yum list | grep vncyum install tigervnc-server.i686安装完成后&…

简单Linq笔记

Linq是.net 3.5才引入的 要引入命名空间System.Linq. Linq to XML要引入System.Xml.Linq Linq to ADO.NET要引入System.Data.Linq 每个Linq查询都是以from子句开始,Linq查询中,select子句和select子句都是必备子句.Linq查询表达式 必须以select或group子句结束 from字句包括两…

Groovy在Spring中的简单使用实例

2019独角兽企业重金招聘Python工程师标准>>> 步骤一&#xff1a; 如果你使用的是Eclipse,则需先添加groovy插件&#xff0c;以便操作groovy文件。 可参&#xff1a;http://blog.csdn.net/haigenwong/article/details/22947075 步骤二&#xff1a; 步骤三&#xff1a…

.net core 2.0学习记录(一):搭建一个.Net Core网站项目

.Net Core开发可以使用Visual Studio 2017或者Visual Studio Code,下面使用Visual Studio 2017搭建一个.net Core MVC网站项目。 一.新建项目 二.选择 Web应用程序(模型视图控制器) 三.项目结构和之前的比对还是有很大的不同,wwwroot用来存放前端的一些静态资源(css/js/image/h…

一个APP的由来

之前在站酷、UI中国、优设等网站看过不少的APP教程、规范等一些东西。自认为有些规范讲的内容过于繁琐&#xff0c;对于像我这样的大多数设计师来说看着看着就懵逼了.... 如何联系我&#xff1a;【万里虎】www.bravetiger.cn 【QQ】3396726884 &#xff08;咨询问题100元起&…

linux qt 添加.so,Linux环境下qt/qt creator添加OpenCV的配置

第一次使用qtcreator&#xff0c;我是做图像处理的&#xff0c;想在Ubuntu下将qtcreator和opencv的环境配置起来&#xff0c;着资料和尝试配置&#xff0c;耗费了我一个上午和一个下午&#xff0c;终于最终摸出了门路&#xff0c;以供大家分享。第一步&#xff1a;下载和安装op…

Auto Layout 和 Constraints

文章修改 2月1日&#xff1a;添加使用约束、编辑约束和iOS特性三个部分2月24日&#xff1a;根据自己的理解&#xff0c;修改iOS特性部分的内容 自动布局Auto Layout Auto Layout&#xff0c;通过设置在View上的约束&#xff0c;动态计算视图层次结构中所有的View的尺寸和位置。…

tkinter的GUI设计:界面与逻辑分离(三)-- 多页面

知识点&#xff1a; 使用 tkinter.Frame.tkraise() 函数去提升当前 tkinter.Frame 的 z 轴顺序&#xff0c;使得多个 tkinter.Frame 的可见性得以切换 本文基于&#xff1a;win7 python34 1 2 3 4 5 import matplotlib matplotlib.use("TkAgg")from matplotlib.back…

Android源码解析--SwipeMenuListView仿QQ聊天左滑

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/50612714 绪论&#xff1a; 好久没写博客了&#xff0c;最近比较懒&#xff0c;不想写博客&#xff0c;但是在看书&#xff0c;看一些Android进阶的书&#…

java main方法背后的故事?(转)

jvm java 看似一种语言&#xff0c;实则一个巨大的体系的王国&#xff0c;开发这么多年了&#xff0c;还是没有搞懂,我以为我懂了&#xff0c;可是过了一段时间又忘了&#xff0c;所以说还是没懂 1、main方法说起 编译完我们的java文件后&#xff0c;需要有个一含有main方法的类…

亲历腾讯WEB前端开发三轮面试经历及面试题

【一面】~110分钟 2014/09/24 11:20 星期三 进门静坐30分钟做题。 填空题大题问答题 >>填空题何时接触电脑 何时接触前端运算符 字符串处理 延时 display position XMLHttpRequest 正则Jquery绑定事件 cookie >>大题BOM浏览器…

linux网卡名称乱编,小斗CentOS7.x网卡名称错乱、及网卡启动失败。

本帖最后由 Zack 于 2018-5-31 13:39 编辑最近在搞CentOS7装机的事情&#xff0c;在此记录期间遇到关于网卡方面的坑&#xff0c;整理分享下&#xff0c;以免大家继续再踩。一、在CentOS7默认装完系统之后网卡名称一改之前的名称习惯&#xff0c;网卡名称为enoxxxxx(之前命名规…