Implementing Syncfusion ASP.NET Core Kanban
Table of Contents
- Setup and First Board - Data Binding - Cards - Columns - Swimlanes - Drag and Drop - Card Edit Dialog - Sorting, Priority, and Validation - Tooltip, Style, and Dimensions - Persistence, Localization, and Responsive - Virtual Scrolling and Accessibility - Events - Methods - All Properties Reference - How-To Recipes
Quick Start
// HomeController.cs
public IActionResult Index()
{
ViewBag.data = new KanbanDataModels().KanbanTasks();
return View();
}<!-- Index.cshtml -->
<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data">
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>
<e-kanban-column headerText="Testing" keyField="Testing"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
</ejs-kanban>Prerequisites:
- NuGet:
Install-Package Syncfusion.EJ2.AspNet.Core _ViewImports.cshtml:@addTagHelper *, Syncfusion.EJ2_Layout.cshtml: Fluent CSS +ej2.min.jsCDN links +<ejs-scripts></ejs-scripts>
→ For full setup details, see references/getting-started.md
When to Use This Skill
Use this skill when you need to:
- Build a Kanban board — multi-column workflow visualization
- Configure columns — single/multi-key columns, stacked headers, toggle, drag
- Add swimlanes — group cards by team, user, or category with frozen rows
- Enable drag-and-drop — between columns, swimlanes, or external components
- Implement card dialogs — edit dialog with custom fields, templates, CRUD persistence
- Bind remote data — OData, WebAPI, UrlAdaptor with CRUD operations
- Apply sorting — by index, data source order, or custom field
- Set card priorities — exact-position drop ordering via numeric rank field
- Add column constraints — min/max card count validation per column
- Show tooltips — default or template-based hover tooltips
- Enable virtual scrolling — handle large datasets (100k+ cards) efficiently
- Configure accessibility — WCAG 2.2 AA, keyboard navigation, screen reader support
- Localize or RTL — multi-language support and right-to-left layout
- Filter or search cards — using the
queryproperty - Change columns dynamically — update column configuration at runtime
- Handle events — react to card clicks, drags, dialog open/close, data binding, and more
- Call methods programmatically — add/update/delete cards, open dialogs, show/hide columns, refresh the board
- Reference all properties — full list of component and sub-model properties with types and defaults
Documentation and Navigation Guide
Setup and First Board
📄 Read: references/getting-started.md
- NuGet installation and package setup
- Tag Helper registration in
_ViewImports.cshtml - CDN configuration (CSS + JS) in
_Layout.cshtml - Minimal Kanban board with 4 columns
- Basic swimlane quickstart
- License key registration
Data Binding
📄 Read: references/data-binding.md
- Local data binding via
@ViewBag.data - Remote data: OData, ODataV4, WebAPI, UrlAdaptor
<e-data-manager>configuration- CRUD operations with
insertUrl,updateUrl,removeUrl,crudUrl - Custom adaptor pattern
actionFailureevent handling- Ajax loading indicator behavior
Cards
📄 Read: references/cards.md
headerField(mandatory unique card ID)showHeader— show/hide card headercontentField— card body text field- Card template with jsrender syntax
selectionType— None, Single, Multiple- Card color customization via
colorField
Columns
📄 Read: references/columns.md
- Single-key and multi-key
keyFieldmapping headerText— column display name- Column header template
allowToggle— collapsible columnsisExpanded— initial expand/collapse state- Stacked headers (
<e-kanban-stackedheaders>) - Column-level drag (
allowColumnDragAndDrop) showItemCount— display card count in header
Swimlanes
📄 Read: references/swimlane.md
keyField— data field to group bytextField— display label field- Swimlane header template
sortBy— sort swimlane rowsallowDragAndDrop— enable cross-swimlane card dragshowEmptyRow— display empty swimlane rowsshowItemCount— card count per swimlaneenableFrozenRows— sticky swimlane headers on scroll
Drag and Drop
📄 Read: references/drag-and-drop.md
- Internal column drag (default enabled)
allowDragAndDrop="false"— disable all drag- Per-column
allowDrag/allowDropflags transitionColumns— restrict allowed column transitions- Cross-swimlane drag via
swimlaneSettings.allowDragAndDrop - External drag:
externalDropIdproperty - Kanban-to-Kanban drag (
dragStopevent +deleteCard/addCard) - Kanban-to-Treeview and Kanban-to-Schedule integration
Card Edit Dialog
📄 Read: references/dialog.md
- Default dialog (double-click card)
- Custom dialog fields via
<e-kanban-dialogsettings fields="..."> - Field types: String, Numeric, TextArea, DropDown, TextBox, Input
- Custom dialog template with EJ2 component initialization
- Preventing dialog open with
dialogOpenevent +args.cancel = true - Programmatic add:
kanbanObj.openDialog('Add', data) - CRUD persistence via UrlAdaptor with server-side
EditParamsclass
Sorting, Priority, and Validation
📄 Read: references/sorting-priority-validation.md
<e-kanban-sortsettings>withsortBy,field,directionsortByvalues: Index, DataSourceOrder, Custom- Priority field:
<e-kanban-cardsettings priority="RankId">for exact-position drops - Column min/max card count:
minCount,maxCounton<e-kanban-column> - Constraint type: Column (default) or Swimlane
- Visual color indication on constraint violation
Tooltip, Style, and Dimensions
📄 Read: references/tooltip-style-dimensions.md
enableTooltip="true"— hover tooltip on cardstooltipTemplate— custom HTML tooltip template- CSS class reference for all Kanban elements
- Sticky header pattern
widthandheight— auto, pixel, percentage values
Persistence, Localization, and Responsive
📄 Read: references/persistence-localization-responsive.md
enablePersistence="true"— localStorage state savinglocaleproperty +ej.base.L10n.load()script- All locale key names for Kanban strings
enableRtl="true"— right-to-left layout- Mobile responsive behavior (swipe, tap-hold, swimlane menu)
Virtual Scrolling and Accessibility
📄 Read: references/virtual-scrolling-accessibility.md
enableVirtualization="true"— on-demand card renderingcardHeight— fixed height required for virtualization- Server-side
KanbanVirtualizationparameter handling - WCAG 2.2 AA compliance table
- WAI-ARIA attributes (
aria-label,aria-expanded,aria-selected, etc.) - Keyboard shortcuts reference
AllowKeyboard="false"— disable keyboard interaction
Events
📄 Read: references/events.md
ActionBegin/ActionComplete/ActionFailure— lifecycle and error handlingCardClick/CardDoubleClick/CardRendered— card interaction hooksColumnDrag/ColumnDragStart/ColumnDrop— column reorder eventsCreated/DataBinding/DataBound/DataSourceChanged— initialization and data eventsDialogOpen/DialogClose— intercept or cancel dialog (useargs.cancel = true)Drag/DragStart/DragStop— card drag lifecycle (cross-Kanban scenarios useDragStop)QueryCellInfo— customize column cell elements before render
Methods
📄 Read: references/methods.md
AddCard/UpdateCard/DeleteCard— CRUD card operationsAddColumn/DeleteColumn— dynamic column managementOpenDialog/CloseDialog— programmatic dialog controlShowColumn/HideColumn— toggle column visibilityGetCardDetails/GetColumnData/GetSelectedCards/GetSwimlaneData— data retrievalShowSpinner/HideSpinner— loading indicator controlRefresh/RefreshHeader/RefreshUI— board re-render helpersDataBind/Destroy/AppendTo/Inject— component lifecycle utilities
All Properties Reference
📄 Read: references/properties.md
- Complete list of all
<ejs-kanban>root properties with types, defaults, and examples - Sub-model properties:
CardSettings,Columns,SwimlaneSettings,SortSettings,DialogSettings,StackedHeaders - Enum values:
ConstraintType,SelectionType,SortOrderBy,SortDirection
How-To Recipes
📄 Read: references/how-to.md
- Dynamically change columns at runtime
- Filter cards using the
queryproperty with dropdown - Search cards by field values with text input
- Add header double-click event handler
Common Patterns
Swimlane Board with Remote Data
Use when: You need to group cards by user/team and load data from an API endpoint (OData, WebAPI, etc.) instead of a local collection.
<ejs-kanban id="Kanban" keyField="Status">
<e-data-manager url="/api/tasks" adaptor="ODataV4Adaptor"></e-data-manager>
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
<e-kanban-swimlanesettings keyField="Assignee" textField="Assignee"></e-kanban-swimlanesettings>
</ejs-kanban>Board with Column Constraints
Use when: You need to enforce WIP (Work-In-Progress) limits — preventing too few or too many cards from stacking in a column.
<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data">
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"
minCount="3" maxCount="5" showItemCount="true"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
</ejs-kanban>Board with Card Edit Dialog + CRUD
Use when: Users need to create, edit, or delete cards through a dialog form, with changes persisted to the server via UrlAdaptor.<ejs-kanban id="Kanban" keyField="Status">
<e-data-manager url="/Home/UpdateData" adaptor="UrlAdaptor"
crudUrl="/Home/UpdateData"></e-data-manager>
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"></e-kanban-cardsettings>
<e-kanban-dialogsettings fields="@ViewBag.dialogFields"></e-kanban-dialogsettings>
</ejs-kanban>Virtual Scrolling Board
Use when: The dataset is large (hundreds to thousands of cards) and rendering all cards at once would cause performance issues.
<ejs-kanban id="Kanban" keyField="Status" dataSource="@ViewBag.data"
enableVirtualization="true">
<e-kanban-columns>
<e-kanban-column headerText="To Do" keyField="Open"></e-kanban-column>
<e-kanban-column headerText="In Progress" keyField="InProgress"></e-kanban-column>
<e-kanban-column headerText="Done" keyField="Close"></e-kanban-column>
</e-kanban-columns>
<e-kanban-cardsettings headerField="Title" contentField="Summary"
selectionType="Multiple"></e-kanban-cardsettings>
</ejs-kanban>Key Properties Reference
| Property | Tag | Values | Purpose |
|---|---|---|---|
keyField | <ejs-kanban> | Field name string | Maps cards to columns by status value |
dataSource | <ejs-kanban> | @ViewBag.data | Local data collection |
enableVirtualization | <ejs-kanban> | true/false | Virtual scrolling for large data |
enableTooltip | <ejs-kanban> | true/false | Hover tooltip on cards |
tooltipTemplate | <ejs-kanban> | Template ID string | Custom tooltip HTML template |
allowDragAndDrop | <ejs-kanban> | true/false | Global drag-and-drop toggle |
externalDropId | <ejs-kanban> | Element ID array | Target IDs for external drop |
enablePersistence | <ejs-kanban> | true/false | Save state to localStorage |
locale | <ejs-kanban> | Locale string (e.g. "de") | UI string localization |
enableRtl | <ejs-kanban> | true/false | Right-to-left layout |
width | <ejs-kanban> | auto/px/% | Board width |
height | <ejs-kanban> | auto/px/% | Board height |
AllowKeyboard | <ejs-kanban> | true/false | Keyboard navigation toggle |
headerField | <e-kanban-cardsettings> | Field name string | Unique card ID field (mandatory) |
contentField | <e-kanban-cardsettings> | Field name string | Card body text field |
template | <e-kanban-cardsettings> | Template ID string | Custom card HTML template |
selectionType | <e-kanban-cardsettings> | None/Single/Multiple | Card selection mode |
priority | <e-kanban-cardsettings> | Field name string | Numeric rank field for ordering |
showHeader | <e-kanban-cardsettings> | true/false | Show/hide card header |
keyField | <e-kanban-column> | Status value(s) | Column card filter (single or comma-separated) |
headerText | <e-kanban-column> | Display string | Column title |
allowToggle | <e-kanban-column> | true/false | Collapsible column |
isExpanded | <e-kanban-column> | true/false | Initial expand state |
minCount | <e-kanban-column> | Integer | Minimum cards constraint |
maxCount | <e-kanban-column> | Integer | Maximum cards constraint |
showItemCount | <e-kanban-column> | true/false | Show card count badge |
allowDrag | <e-kanban-column> | true/false | Allow cards to be dragged from column |
allowDrop | <e-kanban-column> | true/false | Allow cards to be dropped into column |
keyField | <e-kanban-swimlanesettings> | Field name string | Swimlane grouping field |
textField | <e-kanban-swimlanesettings> | Field name string | Swimlane display label field |
sortBy | <e-kanban-sortsettings> | Index/DataSourceOrder/Custom | Card sort strategy |
field | <e-kanban-sortsettings> | Field name string | Field to sort by |
direction | <e-kanban-sortsettings> | Ascending/Descending | Sort direction |
Data Model
The standard KanbanDataModels class for all examples:
public class KanbanDataModels
{
public string Id { get; set; }
public string Title { get; set; }
public string Status { get; set; } // Maps to keyField
public string Summary { get; set; } // Card body content
public string Type { get; set; }
public string Priority { get; set; }
public string Tags { get; set; }
public double Estimate { get; set; }
public string Assignee { get; set; } // Used for swimlane grouping
public int RankId { get; set; } // Numeric rank for priority ordering
public string Color { get; set; } // Optional card color field
}