Syncfusion ASP.NET Core Block Editor Control
Overview
A comprehensive skill for implementing Syncfusion EJ2 Block Editor in ASP.NET Core applications using Razor Tag Helpers. This skill covers setup, block configuration, content manipulation, events, and best practices for creating block-based document editors.
The Syncfusion Block Editor is a versatile, block-based content editor that allows users to create and edit structured documents using discrete content blocks. Key capabilities include:
- Multiple Block Types: Paragraph, Headings (1-4), Lists (Bullet, Numbered, Checklist), Code, Tables, Images, Quotes, Callouts, and more
- Nested Structures: Support for collapsible headings, quotes, and callouts with child blocks
- Rich Editor Menus: Slash commands, context menus, inline toolbars, and block action menus
- Drag-and-Drop: Reorder blocks seamlessly with visual feedback
- Content Sanitization: Built-in paste cleanup with configurable denied tags
- Keyboard Shortcuts: Comprehensive shortcuts for formatting, block creation, and management
- Undo/Redo: Configurable undo/redo stack (default 30 actions)
- Globalization: Multi-language support and RTL layout support
- Events: Rich event system for monitoring user interactions and content changes
- Responsive Design: Adaptive UI that works on desktop and mobile devices
- Collaborative Editing: Real-time multi-user document editing with Yjs CRDT framework, remote cursor awareness, user presence tracking, and version history management
Documentation and Navigation Guide
Getting Started
📄 Read: references/getting-started.md
- Installation and package setup
- Basic BlockEditor implementation
- CSS imports and theme selection
- Creating the first Block Editor instance
- Setting initial block content
Built-in Blocks
📄 Read: references/built-in-blocks.md
- Block types overview (Paragraph, Heading, Lists, Code, Table, Embed, etc.)
- Block properties (id, blockType, content, indent)
- Nested block types (CollapsibleHeading, CollapsibleParagraph, Quote, Callout)
- Parent-child relationships and hierarchy
- Expanded state control and placeholders
- CSS class customization and templates
Block Editor Menus
📄 Read: references/blockeditor-menus.md
- Inline toolbar configuration and events
- Block actions menu customization
- Slash commands (/) for quick block insertion
- Context menu configuration
- Toolbar buttons and formatting actions
Drag-Drop and Content
📄 Read: references/drag-drop-and-content.md
- Enable drag-and-drop functionality
- Reordering blocks by dragging
- Multiple block selection and movement
- Visual feedback during drag operations
- Content insertion and block positioning
Methods and API
📄 Read: references/methods-and-api.md
- Block Management: addBlock, removeBlock, moveBlock, updateBlock, getBlock, getBlockCount
- Selection & Cursor: setSelection, setCursorPosition, getSelectedBlocks, getRange, selectRange, selectBlock, selectAllBlocks
- Focus Management: focusIn, focusOut
- Formatting: executeToolbarAction, enableToolbarItems, disableToolbarItems
- Data Export: getDataAsJson, getDataAsHtml, renderBlocksFromJson, parseHtmlToBlocks, print
- Practical examples for each method category
Styling and Appearance
📄 Read: references/styling-and-appearance.md
- CSS theming options (Material, Bootstrap, Fluent, Tailwind, Fabric themes)
- Block-level styling and cssClass property
- Typography options (bold, italic, underline, strikethrough)
- Indentation and nested block styling
- Placeholder text customization
- Dark mode support and custom themes
Advanced Features
📄 Read: references/advanced-features.md
- Paste cleanup and content sanitization (denied tags)
- Keep format and plain text modes
- Undo/Redo functionality and stack configuration
- Keyboard shortcuts and customization
- Read-only mode for view-only editors
- XSS protection and HTML sanitizer
- RTL (Right-to-Left) support
- Globalization and multi-language localization
Collaborative Editing
📄 Read: references/collaborative-editing.md
- Real-time multi-user document editing with Yjs provider integration
- Configuring collaboration adapters and providers (y-websocket, y-webrtc, Hocuspocus, Liveblocks, PartyKit)
- User presence and remote cursor visualization with enableAwareness
- Active user tracking and user configuration with avatarBgColor
- Version history management with snapshots, restore, compare, export, and import operations
- Snapshot lifecycle events (snapshotCreated, snapshotRestored)
- Best practices for development and production deployments
- Troubleshooting collaboration issues
Quick Start Example
Basic Block Editor Setup
Step 1: Install NuGet Package
Install-Package Syncfusion.EJ2.AspNet.Core
Step 2: Register in _ViewImports.cshtml
@addTagHelper *, Syncfusion.EJ2
Step 3: Add CSS and Scripts in _Layout.cshtml
<head>
<link rel="stylesheet" href="https://cdn.syncfusion.com/ej2/dist/ej2.min.css" />
</head>
<body>
@RenderBody()
<script src="https://cdn.syncfusion.com/ej2/dist/ej2.min.js"></script>
<ejs-scripts></ejs-scripts>
@RenderSection("Scripts", required: false)
</body>
Step 4: Create Block Editor in View
@using Syncfusion.EJ2.BlockEditor
<div id='blockeditor-container'>
<ejs-blockeditor id="block-editor" blocks="@ViewBag.BlocksData"></ejs-blockeditor>
</div>
<style>
#blockeditor-container {
margin: 20px auto;
}
</style>
Step 5: Configure Blocks in Controller
using Syncfusion.EJ2.BlockEditor;
public class BlockModel
{
public string id { get; set; }
public string blockType { get; set; }
public object properties { get; set; }
public List<object> content { get; set; }
}
public IActionResult Index()
{
var blocks = new List<BlockModel>
{
new BlockModel
{
id = "heading-1",
blockType = "Heading",
properties = new { level = 1 },
content = new List<object>
{
new { contentType = "Text", content = "Welcome to Block Editor" }
}
},
new BlockModel
{
id = "paragraph-1",
blockType = "Paragraph",
content = new List<object>
{
new { contentType = "Text", content = "Start creating your content with blocks!" }
}
}
};
ViewBag.BlocksData = blocks;
return View();
}
Common Patterns
Pattern 1: Add New Block Dynamically
var blockEditorObj = ej.base.getInstance(document.getElementById('block-editor'), ejs.blockeditor.BlockEditor);
const newBlock = {
id: 'new-paragraph',
blockType: 'Paragraph',
content: [
{
contentType: "Text",
content: 'This is a newly added block'
}
]
};
// Add after a specific block
blockEditorObj.addBlock(newBlock, 'existing-block-id', true);
Pattern 2: Nested Collapsible Structure
new BlockModel
{
blockType = "CollapsibleHeading",
content = new List<object>
{
new { contentType = "Text", content = "Section Title" }
},
properties = new
{
level = 1,
isExpanded = true,
children = new List<BlockModel>
{
new BlockModel
{
blockType = "Paragraph",
content = new List<object>
{
new { contentType = "Text", content = "Hidden content goes here" }
}
}
}
}
}
Pattern 3: Configure Paste Cleanup
<ejs-blockeditor id="block-editor">
<e-blockeditor-pastesettings
deniedTags="@(new string[] { "script", "iframe", "form" })"
keepFormat="true">
</e-blockeditor-pastesettings>
</ejs-blockeditor>
Pattern 4: Custom Slash Commands
var commandMenuItems = new List<object>
{
new
{
id = "timestamp",
groupHeader = "Actions",
label = "Insert Timestamp",
iconCss = "e-icons e-schedule"
},
new
{
id = "separator",
type = "Divider",
groupHeader = "Utility",
label = "Insert Divider",
iconCss = "e-icons e-divider"
}
};
ViewBag.CommandMenuItems = commandMenuItems;
Pattern 5: Readonly Editor for Display
<ejs-blockeditor id="block-editor"
readOnly="true"
blocks="@ViewBag.BlocksData">
</ejs-blockeditor>
Key Properties
| Property |
Type |
Description |
Default |
id |
string |
Unique identifier for the Block Editor instance |
- |
blocks |
List |
Initial block content |
[] |
height |
string |
Height of the editor (px, vh, %) |
auto |
width |
string |
Width of the editor (px, %) |
100% |
readOnly |
bool |
Enable read-only mode |
false |
cssClass |
string |
Custom CSS class for styling |
- |
enableDragAndDrop |
bool |
Enable block drag-and-drop |
true |
enableRtl |
bool |
Enable right-to-left layout |
false |
locale |
string |
Localization culture (e.g., "de", "es") |
"en" |
undoRedoStack |
int |
Number of undo/redo steps |
30 |
keyConfig |
object |
Keyboard shortcuts configuration |
default shortcuts |
Common Use Cases
- Blog Post Editor - Create a structured blog editor with headings, paragraphs, lists, code snippets, and images
- Knowledge Base - Build hierarchical documentation with collapsible sections and nested content
- Newsletter Template Builder - Design email templates with predefined blocks
- Content Management System - Manage modular content with drag-and-drop block reordering
- Documentation Platform - Create technical documentation with code blocks, tables, and callouts
- Form Builder - Create dynamic forms with conditional block visibility
- Collaborative Editing - Implement shared document editing with block-level permissions
Workflow Pattern
When implementing a Syncfusion Block Editor in ASP.NET Core:
- Install and Setup - Follow Getting Started guide for package installation and registration
- Define Block Structure - Choose block types and configure them in references/built-in-blocks.md
- Initialize Editor - Create Block Editor instance with initial blocks
- Configure Features - Enable menus, drag-drop, paste cleanup as needed
- Handle Events - Bind to events for content validation, logging, or integration
- Customize Appearance - Apply CSS themes, custom classes, and styling
- Implement Methods - Use API methods for programmatic content manipulation
- Test and Optimize - Verify functionality and performance
1---2name: syncfusion-aspnetcore-blockeditor3description: Implement Syncfusion Block Editor control in ASP.NET Core applications using Razor Tag Helpers. Use this skill when working with Syncfusion Block Editor, EJ2 BlockEditor, ASP.NET Core block-based content editing, or <ejs-blockeditor> syntax and collaborative editing features, real-time multi-user editing, Yjs integration, user presence and remote cursors, document version history. Covers block management, nested content structures, drag-and-drop functionality, content sanitization, installation, tag helper setup, block types, content manipulation, events, menus, and advanced features for creating rich block-based document editors.4---56# Syncfusion ASP.NET Core Block Editor Control78## Overview910A comprehensive skill for implementing Syncfusion EJ2 Block Editor in ASP.NET Core applications using Razor Tag Helpers. This skill covers setup, block configuration, content manipulation, events, and best practices for creating block-based document editors.1112The Syncfusion Block Editor is a versatile, block-based content editor that allows users to create and edit structured documents using discrete content blocks. Key capabilities include:1314- **Multiple Block Types**: Paragraph, Headings (1-4), Lists (Bullet, Numbered, Checklist), Code, Tables, Images, Quotes, Callouts, and more15- **Nested Structures**: Support for collapsible headings, quotes, and callouts with child blocks16- **Rich Editor Menus**: Slash commands, context menus, inline toolbars, and block action menus17- **Drag-and-Drop**: Reorder blocks seamlessly with visual feedback18- **Content Sanitization**: Built-in paste cleanup with configurable denied tags19- **Keyboard Shortcuts**: Comprehensive shortcuts for formatting, block creation, and management20- **Undo/Redo**: Configurable undo/redo stack (default 30 actions)21- **Globalization**: Multi-language support and RTL layout support22- **Events**: Rich event system for monitoring user interactions and content changes23- **Responsive Design**: Adaptive UI that works on desktop and mobile devices24- **Collaborative Editing**: Real-time multi-user document editing with Yjs CRDT framework, remote cursor awareness, user presence tracking, and version history management2526## Documentation and Navigation Guide2728### Getting Started29📄 **Read:** [references/getting-started.md](references/getting-started.md)30- Installation and package setup31- Basic BlockEditor implementation32- CSS imports and theme selection33- Creating the first Block Editor instance34- Setting initial block content3536### Built-in Blocks37📄 **Read:** [references/built-in-blocks.md](references/built-in-blocks.md)38- Block types overview (Paragraph, Heading, Lists, Code, Table, Embed, etc.)39- Block properties (id, blockType, content, indent)40- Nested block types (CollapsibleHeading, CollapsibleParagraph, Quote, Callout)41- Parent-child relationships and hierarchy42- Expanded state control and placeholders43- CSS class customization and templates4445### Block Editor Menus46📄 **Read:** [references/blockeditor-menus.md](references/blockeditor-menus.md)47- Inline toolbar configuration and events48- Block actions menu customization49- Slash commands (/) for quick block insertion50- Context menu configuration51- Toolbar buttons and formatting actions5253### Drag-Drop and Content54📄 **Read:** [references/drag-drop-and-content.md](references/drag-drop-and-content.md)55- Enable drag-and-drop functionality56- Reordering blocks by dragging57- Multiple block selection and movement58- Visual feedback during drag operations59- Content insertion and block positioning6061### Methods and API62📄 **Read:** [references/methods-and-api.md](references/methods-and-api.md)63- Block Management: addBlock, removeBlock, moveBlock, updateBlock, getBlock, getBlockCount64- Selection & Cursor: setSelection, setCursorPosition, getSelectedBlocks, getRange, selectRange, selectBlock, selectAllBlocks65- Focus Management: focusIn, focusOut66- Formatting: executeToolbarAction, enableToolbarItems, disableToolbarItems67- Data Export: getDataAsJson, getDataAsHtml, renderBlocksFromJson, parseHtmlToBlocks, print68- Practical examples for each method category6970### Styling and Appearance71📄 **Read:** [references/styling-and-appearance.md](references/styling-and-appearance.md)72- CSS theming options (Material, Bootstrap, Fluent, Tailwind, Fabric themes)73- Block-level styling and cssClass property74- Typography options (bold, italic, underline, strikethrough)75- Indentation and nested block styling76- Placeholder text customization77- Dark mode support and custom themes7879### Advanced Features80📄 **Read:** [references/advanced-features.md](references/advanced-features.md)81- Paste cleanup and content sanitization (denied tags)82- Keep format and plain text modes83- Undo/Redo functionality and stack configuration84- Keyboard shortcuts and customization85- Read-only mode for view-only editors86- XSS protection and HTML sanitizer87- RTL (Right-to-Left) support88- Globalization and multi-language localization8990### Collaborative Editing91📄 **Read:** [references/collaborative-editing.md](references/collaborative-editing.md)92- Real-time multi-user document editing with Yjs provider integration93- Configuring collaboration adapters and providers (y-websocket, y-webrtc, Hocuspocus, Liveblocks, PartyKit)94- User presence and remote cursor visualization with enableAwareness95- Active user tracking and user configuration with avatarBgColor96- Version history management with snapshots, restore, compare, export, and import operations97- Snapshot lifecycle events (snapshotCreated, snapshotRestored)98- Best practices for development and production deployments99- Troubleshooting collaboration issues100101## Quick Start Example102103### Basic Block Editor Setup104105**Step 1: Install NuGet Package**106```powershell107Install-Package Syncfusion.EJ2.AspNet.Core108```109110**Step 2: Register in _ViewImports.cshtml**111```razor112@addTagHelper *, Syncfusion.EJ2113```114115**Step 3: Add CSS and Scripts in _Layout.cshtml**116```razor117<head>118 <link rel="stylesheet" href="https://cdn.syncfusion.com/ej2/dist/ej2.min.css" />119</head>120<body>121 @RenderBody()122 123 <script src="https://cdn.syncfusion.com/ej2/dist/ej2.min.js"></script>124 <ejs-scripts></ejs-scripts>125 126 @RenderSection("Scripts", required: false)127</body>128```129130**Step 4: Create Block Editor in View**131```razor132@using Syncfusion.EJ2.BlockEditor133134<div id='blockeditor-container'>135 <ejs-blockeditor id="block-editor" blocks="@ViewBag.BlocksData"></ejs-blockeditor>136</div>137138<style>139 #blockeditor-container {140 margin: 20px auto;141 }142</style>143```144145**Step 5: Configure Blocks in Controller**146```csharp147using Syncfusion.EJ2.BlockEditor;148149public class BlockModel150{151 public string id { get; set; }152 public string blockType { get; set; }153 public object properties { get; set; }154 public List<object> content { get; set; }155}156157public IActionResult Index()158{159 var blocks = new List<BlockModel>160 {161 new BlockModel162 {163 id = "heading-1",164 blockType = "Heading",165 properties = new { level = 1 },166 content = new List<object>167 {168 new { contentType = "Text", content = "Welcome to Block Editor" }169 }170 },171 new BlockModel172 {173 id = "paragraph-1",174 blockType = "Paragraph",175 content = new List<object>176 {177 new { contentType = "Text", content = "Start creating your content with blocks!" }178 }179 }180 };181 182 ViewBag.BlocksData = blocks;183 return View();184}185```186187## Common Patterns188189### Pattern 1: Add New Block Dynamically190191```javascript192var blockEditorObj = ej.base.getInstance(document.getElementById('block-editor'), ejs.blockeditor.BlockEditor);193194const newBlock = {195 id: 'new-paragraph',196 blockType: 'Paragraph',197 content: [198 {199 contentType: "Text",200 content: 'This is a newly added block'201 }202 ]203};204205// Add after a specific block206blockEditorObj.addBlock(newBlock, 'existing-block-id', true);207```208209### Pattern 2: Nested Collapsible Structure210211```csharp212new BlockModel213{214 blockType = "CollapsibleHeading",215 content = new List<object>216 {217 new { contentType = "Text", content = "Section Title" }218 },219 properties = new220 {221 level = 1,222 isExpanded = true,223 children = new List<BlockModel>224 {225 new BlockModel226 {227 blockType = "Paragraph",228 content = new List<object>229 {230 new { contentType = "Text", content = "Hidden content goes here" }231 }232 }233 }234 }235}236```237238### Pattern 3: Configure Paste Cleanup239240```razor241<ejs-blockeditor id="block-editor">242 <e-blockeditor-pastesettings 243 deniedTags="@(new string[] { "script", "iframe", "form" })"244 keepFormat="true">245 </e-blockeditor-pastesettings>246</ejs-blockeditor>247```248249### Pattern 4: Custom Slash Commands250251```csharp252var commandMenuItems = new List<object>253{254 new 255 {256 id = "timestamp",257 groupHeader = "Actions",258 label = "Insert Timestamp",259 iconCss = "e-icons e-schedule"260 },261 new 262 {263 id = "separator",264 type = "Divider",265 groupHeader = "Utility",266 label = "Insert Divider",267 iconCss = "e-icons e-divider"268 }269};270271ViewBag.CommandMenuItems = commandMenuItems;272```273274### Pattern 5: Readonly Editor for Display275276```razor277<ejs-blockeditor id="block-editor" 278 readOnly="true" 279 blocks="@ViewBag.BlocksData">280</ejs-blockeditor>281```282283## Key Properties284285| Property | Type | Description | Default |286|----------|------|-------------|---------|287| `id` | string | Unique identifier for the Block Editor instance | - |288| `blocks` | List<BlockModel> | Initial block content | [] |289| `height` | string | Height of the editor (px, vh, %) | auto |290| `width` | string | Width of the editor (px, %) | 100% |291| `readOnly` | bool | Enable read-only mode | false |292| `cssClass` | string | Custom CSS class for styling | - |293| `enableDragAndDrop` | bool | Enable block drag-and-drop | true |294| `enableRtl` | bool | Enable right-to-left layout | false |295| `locale` | string | Localization culture (e.g., "de", "es") | "en" |296| `undoRedoStack` | int | Number of undo/redo steps | 30 |297| `keyConfig` | object | Keyboard shortcuts configuration | default shortcuts |298299## Common Use Cases3003011. **Blog Post Editor** - Create a structured blog editor with headings, paragraphs, lists, code snippets, and images3022. **Knowledge Base** - Build hierarchical documentation with collapsible sections and nested content3033. **Newsletter Template Builder** - Design email templates with predefined blocks3044. **Content Management System** - Manage modular content with drag-and-drop block reordering3055. **Documentation Platform** - Create technical documentation with code blocks, tables, and callouts3066. **Form Builder** - Create dynamic forms with conditional block visibility3077. **Collaborative Editing** - Implement shared document editing with block-level permissions308309## Workflow Pattern310311When implementing a Syncfusion Block Editor in ASP.NET Core:3123131. **Install and Setup** - Follow Getting Started guide for package installation and registration3142. **Define Block Structure** - Choose block types and configure them in references/built-in-blocks.md3153. **Initialize Editor** - Create Block Editor instance with initial blocks3164. **Configure Features** - Enable menus, drag-drop, paste cleanup as needed3175. **Handle Events** - Bind to events for content validation, logging, or integration3186. **Customize Appearance** - Apply CSS themes, custom classes, and styling3197. **Implement Methods** - Use API methods for programmatic content manipulation3208. **Test and Optimize** - Verify functionality and performance