devexpress/agent-skills/devexpress-reports-blazor

Claude Code and agent skill by devexpress/agent-skills

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Integrate DevExpress Report Viewer and Report Designer into Blazor Server, Blazor WebAssembly, and Blazor Web App. Register AddDevExpressServerSideBlazorReportViewer, AddDevExpressBlazorReporting in Program.cs. Configure DxResourceManager.RegisterScripts in App.razor. Components: DxReportViewer, DxDocumentViewer, DxReportDesigner, DxWasmDocumentViewer, DxWasmReportDesigner. Load reports via OpenReportAsync, ReportName. Customize toolbar, tab panel, parameter editors. Implement IReportProvider, ReportStorageWebExtension. Troubleshoot blank viewer, "Service not registered", missing render mode, Skia DllNotFoundException. Choose between native, JS-based, and WASM component families.

Install

npx vskill@latest install devexpress/agent-skills/devexpress-reports-blazor

SKILL.md

DevExpress Blazor Reporting — Viewer & Designer Integration

Integrates DevExpress report viewing and designing into Blazor applications. Five components across three families cover every Blazor hosting model.

This skill covers Blazor UI component integration only. For creating reports programmatically (bands, controls, data binding, export), use the devexpress-reports-core skill.

Skill boundary — hard stop: This skill does NOT generate XtraReport subclasses, band declarations (DetailBand, GroupHeaderBand), or control code (XRLabel, XRTable, etc.). If a report class is needed, switch to devexpress-reports-core for that part, get the class name or instance, then return here to wire it into the viewer.

Agent Workflow — Three Required Phases

Do not write any code until all three phases are complete. This ensures you load the correct reference files and generate a single coherent step-by-step plan.

  • Phase 1 — Search the project and ask clarifying questions for any unknowns
  • Phase 2 — Apply the decision gates to select the exact component and architecture
  • Phase 3 — Load the matching reference files, merge their steps, present the plan, then execute

Phase 1 — Preflight: Gather Context

Step 1 — Automated Discovery (Do Before Asking Anything)

Run these searches in the project before asking the developer:

  1. Installed packages: dotnet list package → look for DevExpress.Blazor.Reporting.* and their versions
  2. Blazor configuration classification — follow this 4-step algorithm and record the result before selecting any component:

Step A — Solution structure: Find all .csproj files. Is there a .Client project (name suffix or a <ProjectReference> from a server project pointing to a client project)?

Step B — Server `Program.cs` (look for AddRazorComponents call chain):

What is foundPreliminary result
AddRazorComponents() with no AddInteractiveServerComponents() or AddInteractiveWebAssemblyComponents()→ Static
AddInteractiveServerComponents() only→ Interactive Server
AddInteractiveWebAssemblyComponents() only→ Interactive WebAssembly (Client + Server)
Both AddInteractiveServerComponents() + AddInteractiveWebAssemblyComponents()→ Auto candidate; confirm in Step D

Step C — Client `Program.cs`: presence of WebAssemblyHostBuilder.CreateDefault(args) confirms a WASM client project. If this file exists without a server Program.cs that calls MapRazorComponents → Interactive WebAssembly Standalone.

Step D — `@rendermode` in `.razor` files (search App.razor, Routes.razor, all @page components):

Directive / parameterIndicates
@rendermode InteractiveServerInteractive Server
@rendermode InteractiveWebAssemblyInteractive WebAssembly
@rendermode InteractiveAuto or new InteractiveAutoRenderMode(...)Interactive Auto
No directives and no AddInteractive* in Program.csStatic

> Key rule: Both AddInteractiveServerComponents() + AddInteractiveWebAssemblyComponents() in Program.cs does not alone mean Auto mode. Final classification uses the @rendermode directives actually present in components.

Final result — record one of: Static | Interactive Server | Interactive WebAssembly Standalone | Interactive WebAssembly (Client + Server) | Interactive Auto. If ambiguous, ask the user for the Visual Studio template name or the dotnet new command used to create the project.

  1. Existing viewer/designer components: search all .razor files for <DxReportViewer, <DxDocumentViewer, <DxReportDesigner, <DxWasmDocumentViewer, <DxWasmReportDesigner — note component names and file locations
  2. Report sources and name resolution: search for new XtraReport(), IReportProvider, IReportProviderAsync, ReportStorageWebExtension, OpenReportAsync, Report="@, ReportName=", XtraReport loading methods (FromXmlStream, LoadLayoutFromXml, etc.) calls.
  3. Data and connection strings: search appsettings.json for connection strings; search .cs files for custom data record classes used as report data sources
  4. Navigation menu structure:
  • Search for navigation components: NavMenu.razor, NavBar.razor, or any .razor file with <NavLink> tags
  • Typical location: Components/, Layouts/, or root
  • Record the exact file path and one example <NavLink> element (copy its attributes, CSS classes, icon structure)
  • Identify the pattern: flat list vs. grouped categories
  • Record the route naming convention used (e.g., /viewer, /reports, /designer)
  1. (Custom data source discovery) — only if a document viewer with storage or a designer component is found or requested:
  • Search report class files for [DataSource], ObjectDataSource, List<T>, IList properties
  • Extract class names used as data sources (e.g., SalesData, ProductRecord)
  • Record which classes need trust registration (see Phase 2 Decision Gate F)

Record findings. Use them to answer questions below without prompting the developer.

After Discovery: New Component Evaluation

Apply this evaluation immediately after completing items 1–5 above — before asking any clarifying questions.

Using the results from item 3 above, determine:

If existing reporting components were found (item 3) AND the user is requesting a new component (different from what is already there):

  1. Record the new component name explicitly — e.g., "User is adding DxReportDesigner; project already has DxReportViewer + DxWasmDocumentViewer"
  2. Do NOT assume the existing setup applies — each component has distinct requirements. For example:
  • Report Viewer: no controllers required
  • Document Viewers: 1 controller (WebDocumentViewerController)
  • Designers: 3 controllers (WebDocumentViewerController + ReportDesignerController + QueryBuilderController)
  • Different component families require different AddDevExpress*() registrations
  1. Run the rest of Phase 1–3 for the new component alone, as if it were a first integration — then merge with the existing setup only at Phase 3 Step 2
  2. At Phase 3 merge: check for conflicts with existing setup (see anti-pattern checks C20–C23)
  3. Extract the page route from the new page's @page directive (e.g., @page "/reports/viewer") — use this for the navigation link in Phase 3 Step 3B

If no existing components were found, or the user is adding the same component type again: proceed normally.

Step 2 — Clarifying Questions (Ask Only for Unknowns)

Ask only for items that automated discovery could not determine. Combine unresolved items into one message — do not ask one question at a time.

#What to resolveAsk when
Q1Blazor configuration classification: Static / Interactive Server / WASM Standalone / WASM Client+Server / Interactive Auto?Phase 1 Step 1 item 2 result is ambiguous; apply Q1 script below
Q2Component needed: Native Viewer or JS-based Viewer?User said "viewer" without specifying; apply Q2 script below
Q3Report source: existing report class, by name via a service, or a new sample report is needed?No report class, IReportProvider, or ReportStorageWebExtension found in project; apply Q3 script below
Q4Target project for new page: In multi-project WASM setups, which project should receive the new page — server or client? Also needed for Phase 3 Step 3B navigation link addition.User requested a new page in a multi-project solution (WASM Client+Server or Interactive Auto); apply Q4 script below
Q1 Script — Ambiguous Blazor Configuration

When Phase 1 Step 1 item 2 (4-step classification algorithm) cannot determine the hosting mode unambiguously, ask the developer directly to identify their target configuration and the project for component integration:

"I couldn't auto-detect your Blazor configuration. Which hosting model applies?
Static / Interactive Server / Interactive WebAssembly Standalone / Interactive WebAssembly (Client + Server) / Interactive Auto
For multi-project options (Client + Server or Auto): should the viewer/designer page go in the Server or Client project?"

Use the developer's responses to immediately confirm the hosting mode and target project, bypassing the need for further investigation.

Q2 Script — Viewer Ambiguity

When the user requests "a report viewer" without naming a component, present this choice explicitly:

"There are two viewer options — which fits your needs?
- Native Blazor Viewer (DxReportViewer) — pure C# customization, no JavaScript required, works on Blazor Server and WebAssembly
- JS-Based Document Viewer (DxDocumentViewer / DxWasmDocumentViewer) — JavaScript callbacks, mobile-friendly, includes rich export panel, requires MVC middleware
Which would you like?"
Q3 Script — No Reports Found in Project

When no report class, IReportProvider, or ReportStorageWebExtension is found:

"No reports were found in the project. How would you like to provide one?
1. Create a new sample report — I'll use the devexpress-reports-core skill to generate a report class
2. Use an existing `.repx` file — point me to it and I'll wire it in via a report storage or provider
3. Implement a report provider — I'll create the report myself"

If the developer chooses option 1: immediately load the `devexpress-reports-core` skill (or launch a subagent using that skill if the environment supports runSubagent). Confirm the generated report class name with the developer before proceeding with viewer integration. Do not proceed until a report class name is available.

Q4 Script — Target Project for New Page in Multi-Project Solutions

When the user requests a new page to be added to the project and the configuration is Interactive WebAssembly (Client + Server) or Interactive Auto, confirm the target project. Use the automatic assignment table from Decision Gate D if the component family is already known, or ask explicitly:

"Your project has a server project ([ServerProjectName]) and a client project ([ClientProjectName]). Which project should receive the new viewer/designer page?
- Server project — for DxWasmDocumentViewer, DxWasmReportDesigner, DxReportViewer (not available in Interactive Auto) or if you prefer server-side report processing
- Client project — for DxDocumentViewer, DxReportDesigner, DxReportViewer (not available in Interactive Auto) or if you prefer client-side WASM execution"

If the component is already determined (e.g., user explicitly said "DxDocumentViewer"), use the automatic assignment from Decision Gate D and confirm:

"For DxDocumentViewer in Interactive WebAssembly mode, the page belongs in [ClientProjectName]. Proceed?"

Phase 2 — Component and Architecture Selection

Decision Gate 0 — Blazor Configuration × Component Compatibility (Mandatory First Step)

Use the Blazor configuration result from Phase 1, Step 1 item 2. Before selecting any component, apply the matrix below to filter the valid options.

Hosting Mode × Component Compatibility

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
52
Repository forks
8
7-day trend score
20

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/devexpress/agent-skills/devexpress-reports-blazor/badge)](https://verified-skill.com/skills/devexpress/agent-skills/devexpress-reports-blazor)

Something wrong with this skill or its page? Tell us.