From b9b37680eb5b26a7edf350f85556506190813101 Mon Sep 17 00:00:00 2001 From: Sivakumar Manimaran Date: Fri, 6 Feb 2026 10:28:23 +0530 Subject: [PATCH 1/3] Make the UG documentation for Blazor Scheduler With MinimalAPI --- blazor-toc.html | 7 +- .../images/blazor-minimalAPI-frontend.png | Bin 0 -> 83232 bytes blazor/scheduler/minimalapi.md | 680 ++++++++++++++++++ 3 files changed, 686 insertions(+), 1 deletion(-) create mode 100644 blazor/scheduler/images/blazor-minimalAPI-frontend.png create mode 100644 blazor/scheduler/minimalapi.md diff --git a/blazor-toc.html b/blazor-toc.html index 841faecc35..f12ab596dc 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -4304,7 +4304,12 @@
  • Appointment customization
  • -
  • Data Binding
  • +
  • + Data Binding + +
  • CRUD Actions
  • Virtual Scrolling
  • Editor Window Customization
  • diff --git a/blazor/scheduler/images/blazor-minimalAPI-frontend.png b/blazor/scheduler/images/blazor-minimalAPI-frontend.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfe31541ffe9493495fbcdba9f16b9899bd0154 GIT binary patch literal 83232 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 CS4frs literal 0 HcmV?d00001 diff --git a/blazor/scheduler/minimalapi.md b/blazor/scheduler/minimalapi.md new file mode 100644 index 0000000000..6ea4fe92c6 --- /dev/null +++ b/blazor/scheduler/minimalapi.md @@ -0,0 +1,680 @@ +--- +layout: post +title: Minimal API Data Binding in Blazor Scheduler Component | Syncfusion +description: Learn about consuming data from ASP.NET Core Minimal API and binding it to Syncfusion Blazor Scheduler Component, and performing CRUD operations. +platform: Blazor +control: Scheduler +documentation: ug +--- + +# Connecting ASP.NET Core Minimal API to Syncfusion Blazor Scheduler Component + +The Syncfusion® Blazor Scheduler component supports binding data from ASP.NET Core [Minimal API](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis) endpoints hosted within the same application. This approach enables seamless integration of appointment data with full CRUD (Create, Read, Update, Delete) functionality without requiring a separate backend project. + +This documentation explains how to create a Blazor Server application that hosts Minimal API endpoints in the same project, enabling the Scheduler component to perform CRUD operations on in-memory appointment data through RESTful HTTP requests. + +## Prerequisites + +Before starting, ensure you have the following installed: + +- **.NET SDK 8.0 or later** +- **Visual Studio 2022 (v17.8+) or later** or **Visual Studio Code** with C# extension + +## Binding data from Minimal API endpoints + +This section explains how to create an ASP.NET Core Minimal API backend within a Blazor Server application and bind appointment data to the Syncfusion® Blazor Scheduler component. The following steps demonstrate the actual project creation flow. + +### Step 1: Create a Blazor Web App + +Create a **Blazor Web App** using Visual Studio 2022 or .NET CLI. + +**Using Visual Studio 2022:** +1. Open Visual Studio 2022 +2. Click **Create a new project** +3. Search for **Blazor Web App** template +4. Configure project name as **BlazorSchedulerApp** +5. Select **.NET 8.0** as the target framework +6. Set **Interactive render mode** to **Server** +7. Set **Interactivity location** to **Per page/component** +8. Click **Create** + +**Using .NET CLI:** +```bash +dotnet new blazor -n BlazorSchedulerApp --interactivity Server +cd BlazorSchedulerApp +``` + +> Configure the Interactive render mode to **InteractiveServer** during project creation as the Scheduler requires interactivity for CRUD operations. + +### Step 2: Install Required NuGet Packages + +Install the Syncfusion Blazor packages using the .NET CLI: + +**Using .NET CLI:** +```bash +dotnet add package Syncfusion.Blazor.Schedule +dotnet add package Syncfusion.Blazor.Themes +``` + +> After installing packages, build the project to ensure all dependencies are restored correctly: `dotnet build` + +### Step 3: Create the Appointment Model + +Create a model class to represent scheduler appointments with all required properties. + +{% tabs %} +{% highlight csharp tabtitle="Models/AppointmentData.cs" %} + + namespace BlazorSchedulerApp.Models; + + public class AppointmentData + { + public int Id { get; set; } + public string Subject { get; set; } = "Add Title"; + public string Location { get; set; } = string.Empty; + public DateTime StartTime { get; set; } + public DateTime EndTime { get; set; } + public string Description { get; set; } = string.Empty; + public bool IsAllDay { get; set; } + public string? RecurrenceRule { get; set; } + public int? RecurrenceID { get; set; } + public string? RecurrenceException { get; set; } + } +{% endhighlight %} +{% endtabs %} + +**Key Properties Explanation:** + +- **Id**: Primary key for the appointment (auto-generated by API) +- **Subject**: Title of the appointment +- **StartTime/EndTime**: Date and time range for the appointment +- **Location**: Where the appointment takes place +- **IsAllDay**: Flag for all-day events +- **RecurrenceRule**: Rule for recurring appointments (e.g., daily, weekly) +- **RecurrenceID**: Links recurring appointment instances +- **RecurrenceException**: Handles exceptions in recurring series + +> **Note**: All properties use default values to avoid null reference issues. The API will handle generating unique IDs for new appointments. + +### Step 4: Create the Appointment Service + +Implement a service layer to handle HTTP communication with the Minimal API endpoints. + +{% tabs %} +{% highlight csharp tabtitle="Services/AppointmentService.cs" %} + + using BlazorSchedulerApp.Models; + using System.Net.Http.Json; + + namespace BlazorSchedulerApp.Services; + + public class AppointmentService + { + private readonly HttpClient _httpClient; + + public AppointmentService(HttpClient httpClient) + { + _httpClient = httpClient; + } + + /// + /// Retrieves all appointments from the API + /// + public async Task> GetAppointmentsAsync() + { + try + { + var result = await _httpClient.GetFromJsonAsync>("/api/appointments"); + return result ?? new List(); + } + catch (Exception ex) + { + Console.WriteLine($"Error fetching appointments: {ex.Message}"); + return new List(); + } + } + + /// + /// Retrieves a single appointment by ID + /// + public async Task GetAppointmentByIdAsync(int id) + { + try + { + return await _httpClient.GetFromJsonAsync($"/api/appointments/{id}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error fetching appointment: {ex.Message}"); + return null; + } + } + + /// + /// Creates a new appointment via the API + /// + public async Task CreateAppointmentAsync(AppointmentData appointment) + { + try + { + var response = await _httpClient.PostAsJsonAsync("/api/appointments", appointment); + if (response.IsSuccessStatusCode) + { + return await response.Content.ReadFromJsonAsync(); + } + return null; + } + catch (Exception ex) + { + Console.WriteLine($"Error creating appointment: {ex.Message}"); + return null; + } + } + + /// + /// Updates an existing appointment via the API + /// + public async Task UpdateAppointmentAsync(int id, AppointmentData appointment) + { + try + { + var response = await _httpClient.PutAsJsonAsync($"/api/appointments/{id}", appointment); + return response.IsSuccessStatusCode; + } + catch (Exception ex) + { + Console.WriteLine($"Error updating appointment: {ex.Message}"); + return false; + } + } + + /// + /// Deletes an appointment via the API + /// + public async Task DeleteAppointmentAsync(int id) + { + try + { + var response = await _httpClient.DeleteAsync($"/api/appointments/{id}"); + return response.IsSuccessStatusCode; + } + catch (Exception ex) + { + Console.WriteLine($"Error deleting appointment: {ex.Message}"); + return false; + } + } + } +{% endhighlight %} +{% endtabs %} + + +### Step 5: Configure Application Services and Create Minimal API Endpoints + +Update `Program.cs` to register services, configure HttpClient, and define Minimal API endpoints for CRUD operations. + +{% tabs %} +{% highlight csharp tabtitle="Program.cs" %} + + using BlazorSchedulerApp.Components; + using BlazorSchedulerApp.Models; + using BlazorSchedulerApp.Services; + using Microsoft.AspNetCore.Components; + using Syncfusion.Blazor; + + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); + + // Add HttpClient for AppointmentService + builder.Services.AddScoped(sp => + { + var navigationManager = sp.GetRequiredService(); + return new HttpClient + { + BaseAddress = new Uri(navigationManager.BaseUri) + }; + }); + builder.Services.AddScoped(); + + // Add Syncfusion Blazor service + builder.Services.AddSyncfusionBlazor(); + + // Configure CORS + builder.Services.AddCors(options => + { + options.AddDefaultPolicy(policy => + { + policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + + var app = builder.Build(); + + // In-memory data storage for appointments + var appointments = new List + { + new AppointmentData + { + Id = 1, + Subject = "Team Meeting", + Location = "Conference Room A", + StartTime = DateTime.Today.AddHours(10), + EndTime = DateTime.Today.AddHours(11), + Description = "Weekly team sync-up meeting" + }, + new AppointmentData + { + Id = 2, + Subject = "Client Presentation", + Location = "Boardroom", + StartTime = DateTime.Today.AddDays(1).AddHours(14), + EndTime = DateTime.Today.AddDays(1).AddHours(16), + Description = "Quarterly review with client" + }, + new AppointmentData + { + Id = 3, + Subject = "Project Planning", + Location = "Room 301", + StartTime = DateTime.Today.AddDays(2).AddHours(9), + EndTime = DateTime.Today.AddDays(2).AddHours(10).AddMinutes(30), + Description = "Planning session for new project" + } + }; + + // Configure the HTTP request pipeline. + if (!app.Environment.IsDevelopment()) + { + app.UseExceptionHandler("/Error", createScopeForErrors: true); + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseAntiforgery(); + app.UseCors(); + + // ============= Minimal API Endpoints for Appointments ============= + + // GET: Get all appointments + app.MapGet("/api/appointments", () => + { + return Results.Ok(appointments); + }) + .WithName("GetAppointments"); + + // GET: Get appointment by ID + app.MapGet("/api/appointments/{id}", (int id) => + { + var appointment = appointments.FirstOrDefault(a => a.Id == id); + return appointment is not null ? Results.Ok(appointment) : Results.NotFound(); + }) + .WithName("GetAppointmentById"); + + // POST: Create new appointment + app.MapPost("/api/appointments", (AppointmentData appointment) => + { + appointment.Id = appointments.Any() ? appointments.Max(a => a.Id) + 1 : 1; + appointments.Add(appointment); + return Results.Created($"/api/appointments/{appointment.Id}", appointment); + }) + .WithName("CreateAppointment"); + + // PUT: Update appointment + app.MapPut("/api/appointments/{id}", (int id, AppointmentData updatedAppointment) => + { + var appointment = appointments.FirstOrDefault(a => a.Id == id); + if (appointment is null) + return Results.NotFound(); + + appointment.Subject = updatedAppointment.Subject; + appointment.Location = updatedAppointment.Location; + appointment.StartTime = updatedAppointment.StartTime; + appointment.EndTime = updatedAppointment.EndTime; + appointment.Description = updatedAppointment.Description; + appointment.IsAllDay = updatedAppointment.IsAllDay; + appointment.RecurrenceRule = updatedAppointment.RecurrenceRule; + appointment.RecurrenceID = updatedAppointment.RecurrenceID; + appointment.RecurrenceException = updatedAppointment.RecurrenceException; + + return Results.Ok(appointment); + }) + .WithName("UpdateAppointment"); + + // DELETE: Delete appointment + app.MapDelete("/api/appointments/{id}", (int id) => + { + var appointment = appointments.FirstOrDefault(a => a.Id == id); + if (appointment is null) + return Results.NotFound(); + + appointments.Remove(appointment); + return Results.NoContent(); + }) + .WithName("DeleteAppointment"); + + // ============= End of Minimal API Endpoints ============= + + app.MapStaticAssets(); + app.MapRazorComponents() + .AddInteractiveServerRenderMode(); + + app.Run(); +{% endhighlight %} +{% endtabs %} + + + +**Minimal API Benefits:** + +- No controllers or routing configuration required +- Lightweight and performant +- Easy to understand and maintain +- Perfect for small APIs within the same application + +### Step 6: Register Syncfusion Namespaces + +Add required namespaces in `_Imports.razor`: + +{% tabs %} +{% highlight razor tabtitle="Components/_Imports.razor" %} + + @using System.Net.Http + @using System.Net.Http.Json + @using Microsoft.AspNetCore.Components.Forms + @using Microsoft.AspNetCore.Components.Routing + @using Microsoft.AspNetCore.Components.Web + @using static Microsoft.AspNetCore.Components.Web.RenderMode + @using Microsoft.AspNetCore.Components.Web.Virtualization + @using Microsoft.JSInterop + @using BlazorSchedulerApp + @using BlazorSchedulerApp.Components + @using BlazorSchedulerApp.Components.Layout + @using BlazorSchedulerApp.Models + @using BlazorSchedulerApp.Services + @using Syncfusion.Blazor + @using Syncfusion.Blazor.Schedule + +{% endhighlight %} +{% endtabs %} + +> **Note**: These namespaces make Syncfusion components and your models available throughout the application without needing to add `@using` directives in every file. + +### Step 7: Add Syncfusion Theme and Scripts + +Update `App.razor` to include Syncfusion theme CSS and required JavaScript. + +{% tabs %} +{% highlight razor tabtitle="Components/App.razor" %} + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endhighlight %} +{% endtabs %} + +**Theme Options:** + +You can change the theme by replacing `tailwind3.css` with any of these options: +- `bootstrap5.3.css` - Bootstrap 5.3 theme +- `material3.css` - Material Design 3 theme +- `fluent.css` - Microsoft Fluent Design theme +- `fluent2.css` - Microsoft Fluent Design 2 theme + +**Critical: Syncfusion JavaScript File** + +The line `` is **REQUIRED** for Syncfusion components to work with InteractiveServer render mode. Without this script: +- You'll see errors like `"Could not find 'sfBlazor.Toolbar.initialize' ('sfBlazor' was undefined)"` +- Components will fail to initialize and throw JavaScript interop exceptions +- The Scheduler will not render properly + +This script enables the JavaScript interop layer that Syncfusion components need for client-side functionality. + +### Step 8: Create the Scheduler Component + +Replace the contents of `Home.razor` with the following Blazor Scheduler component that provides full CRUD functionality. + +{% tabs %} +{% highlight razor tabtitle="Components/Pages/Home.razor" %} + + @page "/" + @rendermode InteractiveServer + @inject AppointmentService AppointmentService + + Appointment Scheduler + +
    + + + + + + + + + + + + + + + + + +
    + + @code { + private SfSchedule? ScheduleRef; + private DateTime CurrentDate = DateTime.Today; + private View CurrentView = View.Week; + private List Appointments = new(); + + protected override async Task OnInitializedAsync() + { + await LoadAppointments(); + } + + private async Task LoadAppointments() + { + Appointments = await AppointmentService.GetAppointmentsAsync(); + StateHasChanged(); + } + + private async Task OnActionBegin(ActionEventArgs args) + { + try + { + if (args.ActionType == ActionType.EventCreate && args.AddedRecords != null && args.AddedRecords.Any()) + { + foreach (var appointment in args.AddedRecords) + { + var created = await AppointmentService.CreateAppointmentAsync(appointment); + if (created != null) + { + // Update the appointment with the server-generated ID + appointment.Id = created.Id; + } + } + } + else if (args.ActionType == ActionType.EventChange && args.ChangedRecords != null && args.ChangedRecords.Any()) + { + foreach (var appointment in args.ChangedRecords) + { + await AppointmentService.UpdateAppointmentAsync(appointment.Id, appointment); + } + } + else if (args.ActionType == ActionType.EventRemove && args.DeletedRecords != null && args.DeletedRecords.Any()) + { + foreach (var appointment in args.DeletedRecords) + { + await AppointmentService.DeleteAppointmentAsync(appointment.Id); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"Error in OnActionBegin: {ex.Message}"); + args.Cancel = true; + } + } + + } + +{% endhighlight %} +{% endtabs %} + +**Key Implementation Details:** + +- **@rendermode InteractiveServer**: Enables server-side interactivity required for CRUD operations +- **OnActionBegin**: Handles all CRUD operations by calling the AppointmentService +- **OnPopupOpen**: Sets default values when opening the appointment editor +- **Default Title Logic**: Automatically sets "Add Title" for appointments with empty subjects +- **Error Handling**: Cancels the operation if an error occurs to prevent data inconsistency + +**Why Use OnActionBegin?** + +The `OnActionBegin` event fires before any Scheduler action completes, allowing you to: +1. Intercept the operation and call your own API +2. Add custom validation and business logic +3. Handle errors gracefully +4. Control exactly when and how data is saved + + +### Step 9: Run the Application + +With all components in place, you're ready to run the application. + +**Step 1: Build the Application** + +Ensure there are no compilation errors: + +```bash +dotnet build +``` + +**Step 2: Run the Application** + +Start the application: + +```bash +dotnet run +``` + +Or use watch mode for automatic reload during development: + +```bash +dotnet watch +``` + +**Step 3: Access the Scheduler** + +The application will start at `http://localhost:5235` (or the port configured in your `launchSettings.json`). + +Open your browser and navigate to: +``` +http://localhost:5235/scheduler +``` + + + +## Output Preview +![Frontend Preview](./images/blazor-minimalAPI-frontend.png) +*Image illustrating the Syncfusion Blazor Scheduler with Minimal API* + +## Complete Sample Repository + +A complete, working sample implementation is available in the [GitHub repository.](https://github.com/SyncfusionExamples/How-to-integrate-Syncfusion-Blazor-Scheduler-with-MinimalAPI.%E2%80%A6) + +## Troubleshooting + +### JavaScript Errors: 'sfBlazor' is undefined + +**Issue**: Errors like `Could not find 'sfBlazor.Toolbar.initialize'` + +**Fix**: Add Syncfusion script in `App.razor` before ``: +```html + +``` + +### API Returns 404 Not Found + +**Issue**: API calls fail with 404 errors + +**Fix**: +- Ensure endpoints are defined **before** `app.MapRazorComponents()` in `Program.cs` +- Verify routes match (e.g., `/api/appointments`) +- Check browser console for actual URL + +### Service Injection Error + +**Issue**: `Cannot provide a value for property 'AppointmentService'` + +**Fix**: +- Register service in `Program.cs`: `builder.Services.AddScoped();` +- Add `@inject AppointmentService AppointmentService` in `Scheduler.razor` +- Rebuild project + +### Theme Not Applying + +**Issue**: Scheduler looks unstyled + +**Fix**: +- Verify theme CSS in `App.razor`: `_content/Syncfusion.Blazor.Themes/tailwind3.css` +- Clear browser cache +- Check Syncfusion.Blazor.Themes package is installed + +### Duplicate Appointments Created + +**Issue**: Creating one appointment makes multiple copies + +**Fix**: +- Remove duplicate `OnActionBegin` handlers +- Don't call `LoadAppointments()` inside `OnActionBegin` +- Let Scheduler manage the appointments list + +### Navigation Controls Don't Work + +**Issue**: View switching buttons unresponsive + +**Fix**: +- Check `@bind-CurrentView` and `@bind-SelectedDate` are set +- Don't cancel navigation actions in `OnActionBegin` +- Verify Syncfusion script is loaded + +To learn more about the functionality of the Schedule component, refer to the [documentation](https://blazor.syncfusion.com/documentation/scheduler/getting-started). + From 449d10b14bb1d1b2fd6c5b12becc2edaa36111c2 Mon Sep 17 00:00:00 2001 From: Sivakumar Manimaran Date: Tue, 10 Feb 2026 15:05:17 +0530 Subject: [PATCH 2/3] Make the Suggested Changes in UG Documentation --- blazor/scheduler/minimalapi.md | 176 ++++++++++++++++----------------- 1 file changed, 86 insertions(+), 90 deletions(-) diff --git a/blazor/scheduler/minimalapi.md b/blazor/scheduler/minimalapi.md index 6ea4fe92c6..ab5b330e3c 100644 --- a/blazor/scheduler/minimalapi.md +++ b/blazor/scheduler/minimalapi.md @@ -58,7 +58,57 @@ dotnet add package Syncfusion.Blazor.Themes > After installing packages, build the project to ensure all dependencies are restored correctly: `dotnet build` -### Step 3: Create the Appointment Model +## Step 3: Add Import Namespaces + +Open the **Components/_Imports.razor** file and import the `Syncfusion.Blazor` and `Syncfusion.Blazor.Schedule` namespaces. + +{% tabs %} +{% highlight razor tabtitle="Components/_Imports.razor" %} + +@using Syncfusion.Blazor +@using Syncfusion.Blazor.Schedule + +{% endhighlight %} +{% endtabs %} + +## Step 4: Register Syncfusion® Blazor Service + +Register the Syncfusion® Blazor Service in the **Program.cs** file of your Blazor Web App. + +{% tabs %} +{% highlight csharp tabtitle="Program.cs" %} + +using Syncfusion.Blazor; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddSyncfusionBlazor(); + +{% endhighlight %} +{% endtabs %} + +## Step 5: Add stylesheet and script resources + +The theme stylesheet and script can be accessed from NuGet through [Static Web Assets](https://blazor.syncfusion.com/documentation/appearance/themes#static-web-assets). Include the stylesheet reference in the `` section and the script reference at the end of the `` in the **/Components/App.razor** file as shown below: + +```html + + .... + + + + + .... + + + //Blazor Scheduler Component script reference. + + +``` + +### Step 6: Create the Appointment Model Create a model class to represent scheduler appointments with all required properties. @@ -83,6 +133,16 @@ Create a model class to represent scheduler appointments with all required prope {% endhighlight %} {% endtabs %} +Open the **Components/_Imports.razor** file and import the `BlazorSchedulerApp.Models` namespaces. + +{% tabs %} +{% highlight razor tabtitle="Components/_Imports.razor" %} + +@using BlazorSchedulerApp.Models + +{% endhighlight %} +{% endtabs %} + **Key Properties Explanation:** - **Id**: Primary key for the appointment (auto-generated by API) @@ -96,7 +156,7 @@ Create a model class to represent scheduler appointments with all required prope > **Note**: All properties use default values to avoid null reference issues. The API will handle generating unique IDs for new appointments. -### Step 4: Create the Appointment Service +### Step 7: Create the Appointment Service Implement a service layer to handle HTTP communication with the Minimal API endpoints. @@ -208,10 +268,20 @@ Implement a service layer to handle HTTP communication with the Minimal API endp {% endhighlight %} {% endtabs %} +Open the **Components/_Imports.razor** file and import the `BlazorSchedulerApp.Services` namespaces. -### Step 5: Configure Application Services and Create Minimal API Endpoints +{% tabs %} +{% highlight razor tabtitle="Components/_Imports.razor" %} -Update `Program.cs` to register services, configure HttpClient, and define Minimal API endpoints for CRUD operations. +@using BlazorSchedulerApp.Services + +{% endhighlight %} +{% endtabs %} + + +### Step 8: Configure Application Services + +The `Program.cs` file must be updated to register required services, including Syncfusion Blazor components, HttpClient, CORS, and Razor components.This section configures the foundational services used across the Scheduler application. {% tabs %} {% highlight csharp tabtitle="Program.cs" %} @@ -298,7 +368,15 @@ Update `Program.cs` to register services, configure HttpClient, and define Minim app.UseAntiforgery(); app.UseCors(); - // ============= Minimal API Endpoints for Appointments ============= +{% endhighlight %} +{% endtabs %} + +### Step 9: Create Minimal API Endpoints + +Update `Program.cs` to define Minimal API endpoints for CRUD operations. + +{% tabs %} +{% highlight csharp tabtitle="Program.cs" %} // GET: Get all appointments app.MapGet("/api/appointments", () => @@ -376,87 +454,8 @@ Update `Program.cs` to register services, configure HttpClient, and define Minim - Easy to understand and maintain - Perfect for small APIs within the same application -### Step 6: Register Syncfusion Namespaces -Add required namespaces in `_Imports.razor`: - -{% tabs %} -{% highlight razor tabtitle="Components/_Imports.razor" %} - - @using System.Net.Http - @using System.Net.Http.Json - @using Microsoft.AspNetCore.Components.Forms - @using Microsoft.AspNetCore.Components.Routing - @using Microsoft.AspNetCore.Components.Web - @using static Microsoft.AspNetCore.Components.Web.RenderMode - @using Microsoft.AspNetCore.Components.Web.Virtualization - @using Microsoft.JSInterop - @using BlazorSchedulerApp - @using BlazorSchedulerApp.Components - @using BlazorSchedulerApp.Components.Layout - @using BlazorSchedulerApp.Models - @using BlazorSchedulerApp.Services - @using Syncfusion.Blazor - @using Syncfusion.Blazor.Schedule - -{% endhighlight %} -{% endtabs %} - -> **Note**: These namespaces make Syncfusion components and your models available throughout the application without needing to add `@using` directives in every file. - -### Step 7: Add Syncfusion Theme and Scripts - -Update `App.razor` to include Syncfusion theme CSS and required JavaScript. - -{% tabs %} -{% highlight razor tabtitle="Components/App.razor" %} - - - - - - - - - - - - - - - - - - - - - - - - - - -{% endhighlight %} -{% endtabs %} - -**Theme Options:** - -You can change the theme by replacing `tailwind3.css` with any of these options: -- `bootstrap5.3.css` - Bootstrap 5.3 theme -- `material3.css` - Material Design 3 theme -- `fluent.css` - Microsoft Fluent Design theme -- `fluent2.css` - Microsoft Fluent Design 2 theme - -**Critical: Syncfusion JavaScript File** - -The line `` is **REQUIRED** for Syncfusion components to work with InteractiveServer render mode. Without this script: -- You'll see errors like `"Could not find 'sfBlazor.Toolbar.initialize' ('sfBlazor' was undefined)"` -- Components will fail to initialize and throw JavaScript interop exceptions -- The Scheduler will not render properly - -This script enables the JavaScript interop layer that Syncfusion components need for client-side functionality. - -### Step 8: Create the Scheduler Component +### Step 10: Create the Scheduler Component Replace the contents of `Home.razor` with the following Blazor Scheduler component that provides full CRUD functionality. @@ -575,9 +574,7 @@ The `OnActionBegin` event fires before any Scheduler action completes, allowing 4. Control exactly when and how data is saved -### Step 9: Run the Application - -With all components in place, you're ready to run the application. +### Step 11: Run the Application **Step 1: Build the Application** @@ -618,7 +615,7 @@ http://localhost:5235/scheduler ## Complete Sample Repository -A complete, working sample implementation is available in the [GitHub repository.](https://github.com/SyncfusionExamples/How-to-integrate-Syncfusion-Blazor-Scheduler-with-MinimalAPI.%E2%80%A6) +A complete, working sample implementation is available in the [GitHub repository.](https://github.com/SyncfusionExamples/How-to-integrate-Syncfusion-Blazor-Scheduler-with-MinimalAPI) ## Troubleshooting @@ -677,4 +674,3 @@ A complete, working sample implementation is available in the [GitHub repository - Verify Syncfusion script is loaded To learn more about the functionality of the Schedule component, refer to the [documentation](https://blazor.syncfusion.com/documentation/scheduler/getting-started). - From b65b59ab11741e98b7113bbba3530cf202ba76cd Mon Sep 17 00:00:00 2001 From: Sivakumar Manimaran Date: Tue, 10 Feb 2026 20:57:48 +0530 Subject: [PATCH 3/3] Resolve the title error --- blazor/scheduler/minimalapi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blazor/scheduler/minimalapi.md b/blazor/scheduler/minimalapi.md index ab5b330e3c..51fe7a5cc3 100644 --- a/blazor/scheduler/minimalapi.md +++ b/blazor/scheduler/minimalapi.md @@ -7,7 +7,7 @@ control: Scheduler documentation: ug --- -# Connecting ASP.NET Core Minimal API to Syncfusion Blazor Scheduler Component +# Connecting ASP.NET Core Minimal API to Scheduler Component The Syncfusion® Blazor Scheduler component supports binding data from ASP.NET Core [Minimal API](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis) endpoints hosted within the same application. This approach enables seamless integration of appointment data with full CRUD (Create, Read, Update, Delete) functionality without requiring a separate backend project.