Formidable.Blazor 2.0.0

Prefix Reserved
dotnet add package Formidable.Blazor --version 2.0.0
                    
NuGet\Install-Package Formidable.Blazor -Version 2.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Formidable.Blazor" Version="2.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Formidable.Blazor" Version="2.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Formidable.Blazor" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Formidable.Blazor --version 2.0.0
                    
#r "nuget: Formidable.Blazor, 2.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Formidable.Blazor@2.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Formidable.Blazor&version=2.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Formidable.Blazor&version=2.0.0
                    
Install as a Cake Tool

Formidable

Form validation for Blazor, built on FluentValidation — profiles, progressive disclosure, row-stable collections, and one wire format shared by client and server.

I wrote it because the layer between Blazor's EditForm and FluentValidation is one I kept rebuilding by hand, one client form at a time. This is that layer, built once and covered by tests, running a real project's forms today.

What it is

  • Draft and Submit from one validator — two lifecycles ship built in: a lenient Draft profile for save-as-you-go, a strict Submit profile for the real thing, both defined once in the same FluentValidation class. Wizard steps and approval stages are custom profiles over that same definition.
  • A headless component kit — FormidableForm, FormidableField, FormidableFieldMessage, and FormidableSummary own the EditContext and render the validator's verdict. The library ships no CSS, so the kit drops into a UI library, a design system, or plain HTML.
  • One validator, client and server — the same FluentValidation rules run in the browser and again on the server, and the server's ValidationProblemDetails response applies straight into the engine, so a rejected save lights up the exact fields inline.
  • Progressive disclosure — a message waits until the visitor has earned it. A field nobody has touched stays silent whatever its rules say; once they have engaged it, it tells them what would actually block the save. A form opened on a saved draft says what those loaded values have already earned in one call. At submit, which errors show is decided by what is on screen at that moment, and a defensive gate catches the case where every failure would otherwise go unseen.
  • Warnings and infos that never block: a FluentValidation check followed by .WithSeverity(Severity.Warning) or Severity.Info fails as a warning or an info. Either one shows in the same field messages and summary as an error, with its own CSS class, but only errors stop a submit.
  • Collections that keep their errors — a message on a row object belongs to the object, not to the row number, so adding, removing, and reordering rows can never move its error onto the wrong line.

Packages

  • Formidable — validation profiles, ProfiledValidator/DraftSubmitValidator, the model validator seam, ValidationIssue/ValidationReport, INormalizableModel. FluentValidation plus Microsoft.Extensions.DependencyInjection.Abstractions, no Blazor dependency.
  • Formidable.Blazor — the validation engine (EditContext integration, field registry, validation flows) and the headless component kit.
  • Formidable.AspNetCore — minimal-API endpoint filter and MVC action filter, returning ValidationProblemDetails in the same path format the Blazor client consumes.

Quickstart

Install the Blazor package:

dotnet add package Formidable.Blazor

Register it and your FluentValidation validators in Program.cs, using directives included:

using FluentValidation;
using Formidable.Blazor;

builder.Services.AddFormidableBlazor();
builder.Services.AddScoped<IValidator<QuickContact>, QuickContactValidator>();

Add one line to _Imports.razor so the components resolve:

@using Formidable.Blazor

Then wrap a model in FormidableForm and let FormidableInputText, FormidableFieldMessage, and FormidableSummary render the validator's verdict. That is a working form, on any page with an interactive render mode (every page of a standalone WebAssembly app, or a Blazor Web App page carrying @rendermode InteractiveServer, @rendermode InteractiveWebAssembly or @rendermode InteractiveAuto).

In a Blazor Web App (the two-project template), add the same two lines to both Program.cs files: pages prerender and can run on the server, and a validator registered only in the .Client project is invisible there. The quickstart (https://github.com/xfunc-pty-ltd/formidable/blob/main/docs/quickstart.md) has the exact settings per render mode.

The full documentation, the runnable sample app, and every recipe live in the repository:

Licensed under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.0 49 10/10/2026
1.0.2 103 9/27/2026
1.0.1 95 9/24/2026
1.0.0 93 9/22/2026