
在 .NET / ASP.NET Core 应用中通过 CDN 集成 CKEditor 5从零到可运行的完整指南【免费下载链接】ckeditor5Powerful rich text editor framework with a modular architecture, modern integrations, and features like collaborative editing.项目地址: https://gitcode.com/GitHub_Trending/ck/ckeditor5CKEditor 5 虽然没有任何官方的 .NET 集成包但由于它本质上是纯 JavaScript/TypeScript 库因此可以运行在任何能够承载这类静态资源的服务端环境中——包括微软的 .NET 平台。本文将完整讲解如何在 ASP.NET Core 项目中通过 CKEditor 5 Cloud CDN 加载编辑器、配置插件与工具栏、接入许可密钥并用dotnet watch run一键启动验证同时结合本仓库源码说明编辑器初始化、数据读取与后续扩展的底层原理。为什么 .NET 项目可以直接使用 CKEditor 5CKEditor 5 的运行时完全由浏览器执行编辑器 UI、编辑内核模型、视图、控制器以及全部插件都以 JavaScript 实现服务端只需要向页面输出link与script标签即可。对于 .NET 应用ASP.NET Core、Razor Pages、Blazor、MVC 等来说CKEditor 5 与普通的 jQuery、Vue 等前端库没有本质区别——它不依赖任何 .NET 程序集或 NuGet 包也不要求特定的中间件配置。从本仓库源码看经典编辑器ClassicEditor的实现位于 packages/ckeditor5-editor-classic/src/classiceditor.ts它继承自Editor基类并混入了ElementApiMixin通过静态ClassicEditor.create()方法完成实例创建。也就是说任何前端页面只需要拿到ClassicEditor类与所需插件类就能启动一个功能完整的富文本编辑器这与后端技术栈完全解耦。项目准备创建一个 ASP.NET Core 项目本指南以dotnet new webapp创建的基础 ASP.NET CoreRazor Pages项目为例。如果你还没有项目可在命令行执行dotnet new webapp -n CkEditorDotNetDemo cd CkEditorDotNetDemo如果你需要了解 ASP.NET Core 框架本身的搭建方式请参考 ASP.NET Core 官方入门文档。创建完成后项目的目录结构应类似于├── bin ├── obj ├── Pages │ ├── Index.cshtml │ └── ... ├── Properties ├── wwwroot │ ├── css │ ├── js │ ├── lib │ └── favicon.ico ├── appsettings.Development.json ├── appsettings.json └── ...后续所有改动都集中在Pages目录下的Index.cshtml页面模板中。通过 CDN 加载 CKEditor 5前置条件Cloud CDN 许可要使用 CKEditor 的 Cloud CDN 服务需要先创建账户以获取许可密钥。具体来说可以注册 CKEditor 免费商业计划Cloud CDN 分发它每月提供一定量的编辑器加载次数editor loads并开放有限的功能集也可以注册 Premium Features 14 天免费试用用于评估全部付费功能试用无需提供信用卡相关密钥的获取与激活流程详见 License key and activation。重要提示CDN 分发的云托管版本不接受GPL密钥始终要求商业许可密钥GPL密钥仅适用于自托管npm 或 ZIP分发方式。这一点与自托管部署有本质区别详见 license key and activation。修改 Index.cshtml 引入 CDN 资源打开Pages/Index.cshtml把 CKEditor 5 所需的样式与脚本标签加入模板。开源的与付费premium功能放在不同的文件里因此有两组不同的标签——只有在你确实使用 premium 功能时才需要添加 premium 标签。page model IndexModel { ViewData[Title] Home page; } div classtext-center link relstylesheet hrefhttps://cdn.ckeditor.com/ckeditor5/{var ckeditor5-version}/ckeditor5.css / script srchttps://cdn.ckeditor.com/ckeditor5/{var ckeditor5-version}/ckeditor5.umd.js/script !-- Add if you use premium features. -- link relstylesheet hrefhttps://cdn.ckeditor.com/ckeditor5-premium-features/{var ckeditor5-version}/ckeditor5-premium-features.css / script srchttps://cdn.ckeditor.com/ckeditor5-premium-features/{var ckeditor5-version}/ckeditor5-premium-features.umd.js/script !-- -- style .main-container { width: 795px; margin-left: auto; margin-right: auto; } /style div classmain-container div ideditor pHello from CKEditor 5!/p /div /div /div几点说明{var ckeditor5-version}是文档占位符表示要替换为实际使用的版本号当前仓库对应版本为 48.5.0见 packages/ckeditor5/package.json。你可以从 quick start 获取最新推荐版本ckeditor5.css包含编辑器 UI 与内容区所需的全部样式div ideditor是编辑器将要挂载attach的 DOM 元素其中的pHello from CKEditor 5!/p会成为编辑器的初始内容。理解全局变量CKEDITOR 与 CKEDITOR_PREMIUM_FEATURES上面附加的脚本会暴露两个全局变量CKEDITOR开源部分包含编辑器类型类如ClassicEditor与开源插件类CKEDITOR_PREMIUM_FEATURES付费功能部分包含 premium 插件类如FormatPainter。下面的示例使用 JavaScript 对象解构object destructuring从全局变量中取出编辑器类与一组基础插件再把整个配置对象传给create()方法。注意使用 premium 功能必须提供合法的许可密钥。const { ClassicEditor, Essentials, Bold, Italic, Font, Paragraph } CKEDITOR; const { FormatPainter } CKEDITOR_PREMIUM_FEATURES; ClassicEditor .create( { attachTo: document.querySelector( #editor ), licenseKey: YOUR_LICENSE_KEY, plugins: [ Essentials, Bold, Italic, Font, Paragraph, FormatPainter ], toolbar: [ undo, redo, |, bold, italic, |, fontSize, fontFamily, fontColor, fontBackgroundColor, |, formatPainter ] } ) .then( /* ... */ ) .catch( /* ... */ );配置要点逐项拆解配置项作用attachTo指定编辑器挂载的 DOM 元素通过document.querySelector(#editor)获取元素 id 必须与模板中的div ideditor对应licenseKey商业许可密钥云 CDN 分发下不可使用GPLplugins要加载的插件类数组开源插件Essentials、Bold、Italic、Font、Paragraph来自CKEDITORpremium 插件FormatPainter来自CKEDITOR_PREMIUM_FEATUREStoolbar工具栏项列表|为分隔符undo、redo、bold等均为插件注册的按钮名合并脚本后的最终模板将初始化脚本放在div元素之后确保编辑器可以正确挂载到该元素。最终Index.cshtml的完整内容如下page model IndexModel { ViewData[Title] Home page; } div classtext-center link relstylesheet hrefhttps://cdn.ckeditor.com/ckeditor5/{var ckeditor5-version}/ckeditor5.css / script srchttps://cdn.ckeditor.com/ckeditor5/{var ckeditor5-version}/ckeditor5.umd.js/script !-- Add if you use premium features. -- link relstylesheet hrefhttps://cdn.ckeditor.com/ckeditor5-premium-features/{var ckeditor5-version}/ckeditor5-premium-features.css / script srchttps://cdn.ckeditor.com/ckeditor5-premium-features/{var ckeditor5-version}/ckeditor5-premium-features.umd.js/script !-- -- style .main-container { width: 795px; margin-left: auto; margin-right: auto; } /style div classmain-container div ideditor pHello from CKEditor 5!/p /div /div script const { ClassicEditor, Essentials, Bold, Italic, Font, Paragraph } CKEDITOR; const { FormatPainter } CKEDITOR_PREMIUM_FEATURES; ClassicEditor .create( { attachTo: document.querySelector( #editor ), licenseKey: YOUR_LICENSE_KEY, plugins: [ Essentials, Bold, Italic, Font, Paragraph, FormatPainter ], toolbar: [ undo, redo, |, bold, italic, |, fontSize, fontFamily, fontColor, fontBackgroundColor, |, formatPainter ] } ) .then( /* ... */ ) .catch( /* ... */ ); /script /div启动应用验证最后在 .NET 项目的根目录执行dotnet watch rundotnet watch run会启动 Kestrel 开发服务器并监听源文件的变更自动重启。浏览器打开输出的本地地址后即可看到挂载在#editor元素上的 CKEditor 5 编辑器。从源码理解编辑器初始化链路ClassicEditor.create()背后做了什么在 packages/ckeditor5-editor-classic/src/classiceditor.ts 中可以看到构造函数接收 DOM 元素与配置对象后会依次执行通过normalizeSingleRootEditorConstructorParams()与normalizeRootsConfig()将attachTo传入的元素归一化为内部根配置从config.get(attachTo)取得源元素并检查其是否已连接到 DOM——若元素未挂载会抛出editor-source-element-not-attached错误对应源码中的CKEditorError定义this.model.document.createRoot(...)在编辑模型中创建根节点构造ClassicEditorUIView根据配置决定是否启用菜单栏menuBar、工具栏自动分组toolbar.shouldNotGroupWhenFull等 UI 细节。也就是说经典编辑器 内联可编辑区 吸顶工具栏sticky toolbar整体被封装在一个盒状 UI 中。你可以据此理解attachTo为什么必须指向一个真实存在于页面上的元素。在 .NET 中获取与提交编辑器数据集成编辑器之后下一个核心问题通常是用户编辑的内容如何提交给 .NET 后端推荐的做法与 CKEditor 官方 Getting and setting data 指南一致读取数据保存create()返回的编辑器实例引用调用editor.getData()获取 HTML 字符串再通过fetch/XMLHttpRequest或表单字段提交到 .NET 的 Action / Page Handlerlet editor; ClassicEditor .create( { /* ... */ } ) .then( newEditor { editor newEditor; } ) .catch( error { console.error( error ); } ); document.querySelector( #submit ).addEventListener( click, () { const data editor.getData(); // 发送到 ASP.NET Core 的某个 POST 端点 fetch( /api/editor/save, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify( { content: data } ) } ); } );替换数据需要重置内容时调用editor.setData( pSome text./p )表单自动集成如果将 Classic 编辑器挂载在textarea namecontent上编辑器会在表单提交前自动把内容写回该textarea后端可以直接从content表单字段读取 HTML——这种方式在简单 CMS、论坛、评论等场景中非常实用。许可密钥的类型与激活在 .NET 项目中使用 CDN 分发时licenseKey的取值直接影响编辑器行为。根据 License key and activation 的说明主要密钥类型包括试用密钥Trial有效期 14 天解锁全部功能不消耗编辑器加载次数但存在会话时长与修改次数限制仅限评估使用开发密钥Development解锁订阅功能不消耗加载次数仅在localhost、*.test、*.localhost、*.local及内网 IP 段127.0.0.1、192.168.*.*、10.*.*.*、172.*.*.*等开发域生效编辑器会显示开发用途横幅不得用于生产环境生产密钥Production解锁订阅功能且无运行限制在按量计费usage-based billing计划下会消耗编辑器加载次数。无论使用哪种密钥只要在配置中设置一次licenseKey即可覆盖该计划内全部独立的standalone功能文档转换器、CKBox 等服务类功能则需要在对应功能指南中单独配置访问凭据。进阶使用 loadCKEditorCloud 以编程方式加载 CDN 资源对于 .NET 项目而言如果希望更精细地控制资源加载时机例如按条件或按需加载、等待资源就绪后再初始化编辑器官方还提供了loadCKEditorCloud辅助函数相关说明见 Loading CDN resources。用法如下npm install ckeditor/ckeditor5-integrations-commonimport { loadCKEditorCloud } from ckeditor/ckeditor5-integrations-common; const { CKEditor, CKEditorPremiumFeatures } await loadCKEditorCloud( { version: {var ckeditor5-version}, premium: true } );该函数负责注入script/link标签、保证资源只加载一次并返回各 CDN 资源导出的数据。其选项包括version必需、translations语言代码数组、premium是否加载付费功能、ckboxCKBox 集成配置、plugins第三方插件配置以及injectedHtmlElementsAttributes注入标签的自定义属性默认{ crossorigin: anonymous }。注意premium、ckbox、plugins选项会带来额外的网络请求仅在确实需要时使用。后续可以做什么完成基础集成后你可以沿着以下路线继续深入获取与设置数据阅读 Getting and setting data掌握getData()/setData()、自动保存Autosave与离页提醒的最佳实践深度定制编辑器参考 setup 配置章节 了解插件安装与工具栏配置也可以阅读 Toolbar 和 Editor typesClassic、Inline、Balloon、Decoupled、Multi-root选择最适合 .NET 页面布局的编辑器形态按功能扩展前往 features 目录 按需引入图片、表格、协作编辑、导出 PDF/Word 等独立功能模块。总之只要你的 .NET 页面能输出 HTMLCKEditor 5 就能以 CDN 方式无缝嵌入且无需任何 .NET 侧的专用依赖——这也是它作为跨平台富文本解决方案的核心优势所在。【免费下载链接】ckeditor5Powerful rich text editor framework with a modular architecture, modern integrations, and features like collaborative editing.项目地址: https://gitcode.com/GitHub_Trending/ck/ckeditor5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考