当前位置: 首页 > news >正文

asp.net core mvc 富文本编辑的实现

新闻消息等发布需要富文本编辑发布及修改。记录下:

1.采用kindeditor免费插件

2.kindeditor插件图片上传采用了iframe,默认违反了跨域访问的限制。需要将  [ValidateAntiForgeryToken]去掉。

3.具体配置.要求jquery在前面。

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="~/js/jquery.uniform.min.js"></script>
<link rel="stylesheet" href="~/lib/themes/default/default.css" />
<script src="~/lib/kindeditor-all-min.js"></script>
<script src="~/lib/lang/zh-CN.js"></script>

<script type="text/javascript">
    // 初始化 KindEditor
    KindEditor.ready(function (K) {
        window.editor = K.create('#editor', {
            width: '100%', // 编辑器宽度
            height: '500px', // 编辑器高度
            langType: 'zh-CN', // 设置为中文
            uploadJson: '/News/UploadImage', // 图片上传接口
            allowFileManager: false // 是否显示文件管理器
            
        });
         
    });
</script>

4.配合发布页面信息

    <form asp-action="Create">
   
    <div class="form-group">
        <label asp-for="Content" class="control-label"></label>
        <textarea id="editor"  asp-for="Content"></textarea>
        <span asp-validation-for="Content" class="text-danger"></span>
    </div>
   
    <div class="form-group">
        <input type="submit" value="Create" class="btn btn-primary" />
    </div>
</form>

5.create页面信息 正常写即可,kindeditor插件会将编辑内容以string类型放到textarea

  [HttpPost]
     
  public async Task<IActionResult> Create( News news)
  {
      if (ModelState.IsValid)
      {
          _context.Add(news);
          await _context.SaveChangesAsync();
          return RedirectToAction(nameof(Index));
      }
      return View(news);
  }

6.在controller里添加图片上传功能,图片上传到wwwroot下的文件夹。

  [HttpPost]
  public async Task<IActionResult> UploadImage(IFormFile imgFile)
  {
      if (imgFile == null || imgFile.Length == 0)
      {
          return Json(new { error = 1, message = "文件为空" });
      }

      // 检查文件类型
      var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif" };
      var fileExtension = Path.GetExtension(imgFile.FileName).ToLower();
      if (!allowedExtensions.Contains(fileExtension))
      {
          return Json(new { error = 1, message = "文件类型不支持" });
      }

      // 保存文件
      var uploadsFolder = Path.Combine(_env.WebRootPath, "uploads");
      if (!Directory.Exists(uploadsFolder))
      {
          Directory.CreateDirectory(uploadsFolder);
      }

      var fileName = Guid.NewGuid().ToString() + fileExtension;
      var filePath = Path.Combine(uploadsFolder, fileName);

      using (var stream = new FileStream(filePath, FileMode.Create))
      {
          await imgFile.CopyToAsync(stream);
      }

      // 返回 KindEditor 需要的 JSON 格式
      return Json(new
      {
          error = 0,
          url = $"/uploads/{fileName}"
      });
  }

7.修改同添加一样,但是delete要单独对图片进行删除,因为默认的只是删除了sqlserver里table的信息,文件夹下的图片需要格外处理。采用HtmlAgilityPack对table记录的string进行查找匹配处理。

   // POST: News/Delete/5
   [HttpPost, ActionName("Delete")]
   public async Task<IActionResult> DeleteConfirmed(int id)
   {
       var news = await _context.News.FindAsync(id);
      
       if (news != null)
       {
           _context.News.Remove(news);
           Removeimgs(news.Content);
       }

       await _context.SaveChangesAsync();
       return RedirectToAction(nameof(Index));
   }
   public void Removeimgs(string imgstrs)
   {
       var doc = new HtmlAgilityPack.HtmlDocument();
       doc.LoadHtml(imgstrs);
       var srcList = doc.DocumentNode.Descendants("img")
                       .Select(img => img.GetAttributeValue("src", ""))
                       .Where(s => !string.IsNullOrEmpty(s));
       foreach (var src in srcList) {
           if (!string.IsNullOrEmpty(src))
           {
               var oldFilePath =Path.Combine(_env.WebRootPath,src.TrimStart('/'));
               
               if (System.IO.File.Exists(oldFilePath))
               {
                   System.IO.File.Delete(oldFilePath);
               }
           }
       }
   }

8.在详细内容页面,需要将数据库中记录的string修改成html格式。

@Html.Raw(Model.Content)

​​​​​​

相关文章:

  • matlab 汽车abs的模糊pid和pid控制仿真
  • 美国股市主要指数介绍(Major U.S. Stock Market Indexes):三大股指(中英双语)
  • ubuntu安装docker 无法拉取问题
  • Android13-包安装器PackageInstaller-之apk安装流程
  • std::ranges::contains
  • 数仓搭建:DWB层(基础数据层)
  • Ubuntu 下 systemd 介绍
  • 应用案例 | uaGate SI助力汽车零部件工厂将生产数据传输到MES
  • 进阶——第十六届蓝桥杯嵌入式熟练度练习(开发板捕获频率和占空比)
  • 【云原生】最新版Kubernetes集群基于Containerd部署
  • VMware 17 安装 VMTools(win 7旗舰 X64)
  • 使用redis分布式锁来解决高并发场景
  • MySQL中的事务隔离级别有哪些?
  • 基于STM32、HAL库、FM24CL64(I2C接口)驱动程序设计
  • 达梦数据库针对慢SQL,收集统计信息清除执行计划缓存
  • VScode内接入deepseek包过程(本地部署版包会)
  • 【网络编程】之数据链路层
  • 使用卷积神经网络(CNN)对颜色失真情况下进行数字识别
  • 【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量
  • 请谈谈 em、px、rem、vh、vw 的区别,如何使用?
  • 浙江网站设计 site/2021年度关键词有哪些
  • 做威尼斯网站代理算是违法吗/网络推广怎样做
  • 如何给wordpress文章部分内容加密/seo免费优化工具
  • qq空间注册申请/seo排名官网
  • 网易云音乐网页版/武汉搜索引擎排名优化