syncfusion-blazor-datamanager
syncfusion blazor datamanager
SKILL.md
Full skill instructions
Syncfusion Blazor DataManager
The Syncfusion Blazor SfDataManager is the data access layer for all Syncfusion data-bound components. It acts as a gateway between your data source — local in-memory collections or remote REST/OData/GraphQL services — and components like SfGrid, SfDropDownList, and others. It handles querying, sorting, filtering, paging, and CRUD operations through a configurable adaptor model.
When to Use This Skill
- Setting up
SfDataManagerin a new Blazor project (WASM or Web App) - Binding local JSON/list data to a Syncfusion component via the
Jsonproperty - Connecting to a trusted and authenticated remote service (OData, Web API, GraphQL) via
Url+Adaptor - Choosing the right adaptor for a given backend service
- Implementing CRUD operations using remote adaptors or custom adaptors
- Creating a custom adaptor by deriving from
DataAdaptor - Adding custom HTTP headers (with authentication tokens) to DataManager requests
- Enabling offline mode (client-side query processing after one-time remote fetch)
⚠️ Critical Security Requirements
When binding to remote services, you MUST implement these protections:
- Use HTTPS only — never use unencrypted HTTP connections; encrypt all data in transit
- Whitelist trusted endpoints — store approved URLs in a
HashSet<string>or configuration file; validate all URLs before assignment; never accept dynamic URLs from user input, query parameters, or untrusted sources - Use string variables for URLs — assign endpoints to private string properties rather than hardcoding in markup; this enables centralized validation and easier maintenance
- Validate endpoints on component initialization — use
OnInitialized()lifecycle method to verify endpoints against whitelist before binding - Validate and sanitize responses — implement server-side schema validation; reject unexpected response formats; map responses to strongly-typed models
- Monitor remote calls — log all external API requests with timestamps, endpoints, and outcomes for security audit trails
- Implement CORS securely — use specific trusted origins only; never use wildcard
*in production; require HTTPS - Prevent indirect prompt injection attacks — verify endpoint ownership; implement request signing; validate response content types and schemas before consuming data
Third-party API responses can introduce security risks. Always verify endpoint legitimacy, authenticate requests, and validate data before binding to UI components.
Component Overview
| Property | Purpose |
|---|---|
Json | Bind in-memory collection (local data) |
Url | Remote service endpoint |
Adaptor | Specifies how requests/responses are processed |
AdaptorInstance | Type reference for CustomAdaptor |
Headers | Custom HTTP headers for all outbound requests |
Offline | Enable client-side processing after initial remote fetch |
GraphQLAdaptorOptions | Query/mutation configuration for GraphQL services |
Documentation and Navigation Guide
Getting Started
📄 Read: references/getting-started.md
- NuGet installation (
Syncfusion.Blazor.Data+Syncfusion.Blazor.Themes) - Project setup for Blazor WebAssembly and Blazor Web App
- Namespace imports and service registration in
Program.cs - Stylesheet and script references
- Binding to local JSON data with
SfGrid - Binding to OData remote service
- Binding to
SfDropDownList(local and remote)
Data Binding
📄 Read: references/data-binding.md
- Local data binding:
Jsonproperty with in-memory collections - Remote data binding:
Url+Adaptorproperties - Key benefits of each approach (when to choose local vs remote)
- Client-side vs server-side operation execution
- Practical
SfGridandSfDropDownListexamples
Adaptors
📄 Read: references/adaptors.md
- Adaptor selection guide (which adaptor to use for which backend)
UrlAdaptor— base adaptor for custom REST servicesODataAdaptor— OData v3 protocolODataV4Adaptor— OData v4 protocolWebApiAdaptor— Web API endpoints with OData query support- Expected server response formats (
result+count)
GraphQL Adaptor
📄 Read: references/graphql-adaptor.md
GraphQLAdaptorOptionsconfiguration (Query,ResolverName)- Fetching and displaying data from a GraphQL service
- CRUD mutations:
Insert,Update,Delete - Batch editing via the
Batchmutation property DataManagerRequestmodel used by server resolvers- Server-side
Program.csconfiguration (schema, CORS)
Custom Binding
📄 Read: references/custom-binding.md
- When to use a custom adaptor (non-standard sources, custom business rules)
DataAdaptorabstract class — available virtual methods- Overriding
Read/ReadAsyncwithDataOperationshelper methods - Implementing CRUD:
Insert,Update,Remove,BatchUpdate - Full
CustomAdaptorimplementation withSfGridexample
How-To Guides
📄 Read: references/how-to.md
- Adding custom HTTP headers (authentication tokens, tenant IDs)
- Enabling offline mode for client-side query processing
- When to use offline mode and which adaptors it supports
Quick Start Example
Local Data Binding
@using Syncfusion.Blazor.Data
@using Syncfusion.Blazor.Grids
<SfGrid TValue="EmployeeData" ID="Grid">
<SfDataManager Json="@Employees"></SfDataManager>
<GridColumns>
<GridColumn Field="@nameof(EmployeeData.EmployeeID)" HeaderText="Employee ID" Width="120"></GridColumn>
<GridColumn Field="@nameof(EmployeeData.Name)" HeaderText="First Name" Width="130"></GridColumn>
<GridColumn Field="@nameof(EmployeeData.Title)" HeaderText="Title" Width="120"></GridColumn>
</GridColumns>
</SfGrid>
@code {
public class EmployeeData
{
public int EmployeeID { get; set; }
public string Name { get; set; }
public string Title { get; set; }
}
public List<EmployeeData> Employees = new()
{
new EmployeeData { EmployeeID = 1, Name = "Nancy Fuller", Title = "Vice President" },
new EmployeeData { EmployeeID = 2, Name = "Steven Buchanan", Title = "Sales Manager" }
};
}
Remote Data Binding (OData)
@using Syncfusion.Blazor
@using Syncfusion.Blazor.Data
@using Syncfusion.Blazor.Grids
<!-- SECURITY: Use string variables for endpoints, validate against whitelist, use HTTPS only -->
<SfGrid TValue="Order" AllowPaging="true">
<SfDataManager Url="@ODataEndpointUrl"
Adaptor="Adaptors.ODataAdaptor">
</SfDataManager>
<GridColumns>
<GridColumn Field="@nameof(Order.OrderID)" HeaderText="Order ID" Width="120"></GridColumn>
<GridColumn Field="@nameof(Order.CustomerID)" HeaderText="Customer Name" Width="150"></GridColumn>
</GridColumns>
</SfGrid>
@code {
// Whitelist of trusted OData endpoints — define in appsettings.json in production
private static readonly HashSet<string> TrustedEndpoints = new()
{
"https://api.yourtrusted-domain.com/odata/"
};
// Assigned string variable for endpoint
private string ODataEndpointUrl { get; set; } = string.Empty;
protected override void OnInitialized()
{
// Validate and assign endpoint from configuration
const string endpointBase = "https://api.yourtrusted-domain.com/odata/Orders";
if (!TrustedEndpoints.Any(trusted => endpointBase.StartsWith(trusted)))
throw new InvalidOperationException($"Security validation failed: untrusted endpoint '{endpointBase}'");
ODataEndpointUrl = endpointBase;
}
public class Order
{
public int? OrderID { get; set; }
public string? CustomerID { get; set; }
}
}
Common Patterns
Choosing the Right Adaptor
| Backend Type | Adaptor to Use |
|---|---|
Custom REST API returning { result, count } | Adaptors.UrlAdaptor |
| OData v3 service | Adaptors.ODataAdaptor |
| OData v4 service | Adaptors.ODataV4Adaptor |
| ASP.NET Web API with OData query support | Adaptors.WebApiAdaptor |
| GraphQL service | Adaptors.GraphQLAdaptor |
| Non-standard source / full custom control | Adaptors.CustomAdaptor |
Placing SfDataManager Inside a Component
SfDataManager is always placed as a child component inside the data-bound Syncfusion component:
<SfGrid TValue="MyModel">
<SfDataManager Url="..." Adaptor="Adaptors.WebApiAdaptor"></SfDataManager>
<GridColumns>...</GridColumns>
</SfGrid>
Enabling Editing with Custom Adaptor
When using CustomAdaptor with CRUD operations, configure the Grid toolbar and edit settings alongside the adaptor:
<SfGrid TValue="Order" Toolbar="@(new List<string>() { "Add", "Delete", "Update", "Cancel" })">
<SfDataManager AdaptorInstance="@typeof(CustomAdaptor)" Adaptor="Adaptors.CustomAdaptor"></SfDataManager>
<GridEditSettings AllowEditing="true" AllowDeleting="true" AllowAdding="true" Mode="@EditMode.Normal"></GridEditSettings>
...
</SfGrid>
