Pitasoft.FluentValidation.AspNetCore
1.0.3
dotnet add package Pitasoft.FluentValidation.AspNetCore --version 1.0.3
NuGet\Install-Package Pitasoft.FluentValidation.AspNetCore -Version 1.0.3
<PackageReference Include="Pitasoft.FluentValidation.AspNetCore" Version="1.0.3" />
<PackageVersion Include="Pitasoft.FluentValidation.AspNetCore" Version="1.0.3" />
<PackageReference Include="Pitasoft.FluentValidation.AspNetCore" />
paket add Pitasoft.FluentValidation.AspNetCore --version 1.0.3
#r "nuget: Pitasoft.FluentValidation.AspNetCore, 1.0.3"
#:package Pitasoft.FluentValidation.AspNetCore@1.0.3
#addin nuget:?package=Pitasoft.FluentValidation.AspNetCore&version=1.0.3
#tool nuget:?package=Pitasoft.FluentValidation.AspNetCore&version=1.0.3
Pitasoft.FluentValidation.AspNetCore
English
Pitasoft.FluentValidation.AspNetCore integrates FluentValidation into ASP.NET Core request pipelines using endpoint filters for Minimal API and action filters for MVC / Web API.
When request validation fails, the package converts the errors into Result.ValidationError(...) and delegates HTTP serialization to Pitasoft.Result.AspNetCore, returning 400 Bad Request.
Features
- Minimal API integration with
WithValidator<T>() - Minimal API integration with
WithValidator<T>(instance) - MVC / Web API integration with
[ValidateRequest<T>] - Validation output translated to
Pitasoft.Result.ValidationError(...) - Compatible with
Pitasoft.Result.AspNetCoreresponse formatting - Preserves FluentValidation property paths such as
Name,Address.City, orItems[0].Name
Installation
dotnet add package Pitasoft.FluentValidation.AspNetCore
Dependency injection
Register your FluentValidation validators in ASP.NET Core DI before using the filters:
using FluentValidation;
builder.Services.AddScoped<IValidator<CreateProductRequest>, CreateProductRequestValidator>();
Minimal API example with DI
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Pitasoft.FluentValidation.AspNetCore.Extensions;
using Pitasoft.Result;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IValidator<CreateProductRequest>, CreateProductRequestValidator>();
var app = builder.Build();
app.MapPost("/products", ([FromBody] CreateProductRequest request) =>
Result.Ok())
.WithValidator<CreateProductRequest>();
app.Run();
public sealed record CreateProductRequest(string? Name, decimal Price);
public sealed class CreateProductRequestValidator : AbstractValidator<CreateProductRequest>
{
public CreateProductRequestValidator()
{
RuleFor(x => x.Name)
.NotEmpty()
.WithMessage("Name is required.");
RuleFor(x => x.Price)
.GreaterThan(0)
.WithMessage("Price must be greater than 0.");
}
}
Minimal API example with inline validator
This is useful when you want to attach a concrete validator instance directly to one endpoint:
using FluentValidation;
using Pitasoft.FluentValidation.AspNetCore.Extensions;
using Pitasoft.Result;
var app = WebApplication.Create();
app.MapPost("/products", (CreateProductRequest request) =>
Result.Ok())
.WithValidator(new CreateProductRequestValidator());
app.Run();
MVC / Web API example
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Pitasoft.FluentValidation.AspNetCore.Attributes;
using Pitasoft.Result;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddScoped<IValidator<CreateProductRequest>, CreateProductRequestValidator>();
var app = builder.Build();
app.MapControllers();
app.Run();
[ApiController]
[Route("api/products")]
public sealed class ProductsController : ControllerBase
{
[HttpPost]
[ValidateRequest<CreateProductRequest>]
public object Create([FromBody] CreateProductRequest request)
{
return Result.Ok();
}
}
public sealed record CreateProductRequest(string? Name, decimal Price);
public sealed class CreateProductRequestValidator : AbstractValidator<CreateProductRequest>
{
public CreateProductRequestValidator()
{
RuleFor(x => x.Name).NotEmpty().WithMessage("Name is required.");
RuleFor(x => x.Price).GreaterThan(0).WithMessage("Price must be greater than 0.");
}
}
What happens on validation failure
If the validator reports errors:
- the pipeline is short-circuited
- the package creates
Result.ValidationError(errors) Pitasoft.Result.AspNetCoreconverts it to the HTTP response- the HTTP status code is
400 Bad Request
Notes about Pitasoft.FluentValidation
This package is designed to live in the Pitasoft ecosystem and references Pitasoft.FluentValidation as part of that dependency graph.
At the HTTP boundary, the current implementation validates directly through FluentValidation.IValidator<T> so it can preserve ASP.NET-specific behavior such as request cancellation and asynchronous validation execution. This keeps the package aligned with the wider Pitasoft validation stack without introducing an HTTP-specific abstraction mismatch.
Public API
Minimal API:
WithValidator<T>()WithValidator<T>(IValidator<T> validator)
MVC / Web API:
[ValidateRequest<T>]
Validation behavior
- The first request argument compatible with
Tis validated - Null compatible arguments are also considered for validation
- Validation errors are preserved as structured
ErrorCollection ProblemDetailsis not used as the default contract
Requirements
- ASP.NET Core 8, 9 or 10
FluentValidationPitasoft.FluentValidationPitasoft.Result.AspNetCore
Castellano
Pitasoft.FluentValidation.AspNetCore integra FluentValidation en la tubería de ASP.NET Core usando filtros de endpoint para Minimal API y filtros de acción para MVC / Web API.
Cuando la validación de la petición falla, el paquete convierte los errores en Result.ValidationError(...) y delega la serialización HTTP a Pitasoft.Result.AspNetCore, devolviendo 400 Bad Request.
Características
- Integración con Minimal API mediante
WithValidator<T>() - Integración con Minimal API mediante
WithValidator<T>(instancia) - Integración con MVC / Web API mediante
[ValidateRequest<T>] - Los errores de validación se traducen a
Pitasoft.Result.ValidationError(...) - Compatible con el formateo de respuestas de
Pitasoft.Result.AspNetCore - Conserva rutas de propiedad de FluentValidation como
Name,Address.CityoItems[0].Name
Instalación
dotnet add package Pitasoft.FluentValidation.AspNetCore
Inyección de dependencia
Registra tus validadores de FluentValidation en el contenedor DI de ASP.NET Core antes de usar los filtros:
using FluentValidation;
builder.Services.AddScoped<IValidator<CreateProductRequest>, CreateProductRequestValidator>();
Ejemplo con Minimal API usando DI
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Pitasoft.FluentValidation.AspNetCore.Extensions;
using Pitasoft.Result;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IValidator<CreateProductRequest>, CreateProductRequestValidator>();
var app = builder.Build();
app.MapPost("/products", ([FromBody] CreateProductRequest request) =>
Result.Ok())
.WithValidator<CreateProductRequest>();
app.Run();
public sealed record CreateProductRequest(string? Name, decimal Price);
public sealed class CreateProductRequestValidator : AbstractValidator<CreateProductRequest>
{
public CreateProductRequestValidator()
{
RuleFor(x => x.Name)
.NotEmpty()
.WithMessage("El nombre es obligatorio.");
RuleFor(x => x.Price)
.GreaterThan(0)
.WithMessage("El precio debe ser mayor que cero.");
}
}
Ejemplo con Minimal API usando instancia inline
Es útil cuando quieres asociar una instancia concreta del validador directamente a un endpoint:
using FluentValidation;
using Pitasoft.FluentValidation.AspNetCore.Extensions;
using Pitasoft.Result;
var app = WebApplication.Create();
app.MapPost("/products", (CreateProductRequest request) =>
Result.Ok())
.WithValidator(new CreateProductRequestValidator());
app.Run();
Ejemplo con MVC / Web API
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Pitasoft.FluentValidation.AspNetCore.Attributes;
using Pitasoft.Result;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddScoped<IValidator<CreateProductRequest>, CreateProductRequestValidator>();
var app = builder.Build();
app.MapControllers();
app.Run();
[ApiController]
[Route("api/products")]
public sealed class ProductsController : ControllerBase
{
[HttpPost]
[ValidateRequest<CreateProductRequest>]
public object Create([FromBody] CreateProductRequest request)
{
return Result.Ok();
}
}
public sealed record CreateProductRequest(string? Name, decimal Price);
public sealed class CreateProductRequestValidator : AbstractValidator<CreateProductRequest>
{
public CreateProductRequestValidator()
{
RuleFor(x => x.Name).NotEmpty().WithMessage("El nombre es obligatorio.");
RuleFor(x => x.Price).GreaterThan(0).WithMessage("El precio debe ser mayor que cero.");
}
}
Qué ocurre cuando falla la validación
Si el validador devuelve errores:
- la tubería HTTP se corta antes de ejecutar el endpoint o la acción
- el paquete crea
Result.ValidationError(errors) Pitasoft.Result.AspNetCorelo convierte en respuesta HTTP- el código de estado HTTP es
400 Bad Request
Notas sobre Pitasoft.FluentValidation
Este paquete está pensado para convivir en el ecosistema Pitasoft y referencia Pitasoft.FluentValidation como parte de ese grafo de dependencias.
En la frontera HTTP, la implementación actual valida directamente mediante FluentValidation.IValidator<T> para conservar correctamente el comportamiento específico de ASP.NET, como la cancelación de petición y la validación asíncrona. Así se mantiene alineado con el stack de validación de Pitasoft sin introducir un desajuste en la capa de transporte.
API pública
Minimal API:
WithValidator<T>()WithValidator<T>(IValidator<T> validator)
MVC / Web API:
[ValidateRequest<T>]
Comportamiento de validación
- Se valida el primer argumento de la petición compatible con
T - Los argumentos compatibles con valor
nulltambién se tienen en cuenta - Los errores de validación se conservan como
ErrorCollection ProblemDetailsno se usa como contrato por defecto
Requisitos
- ASP.NET Core 8, 9 o 10
FluentValidationPitasoft.FluentValidationPitasoft.Result.AspNetCore
Autor
Sebastián Martínez Pérez
Licencia
Copyright © 2026 Pitasoft, S.L. Distribuido bajo la licencia incluida en LICENSE.txt.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. 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. |
-
net10.0
- Pitasoft.FluentValidation (>= 2.0.2)
- Pitasoft.Result.AspNetCore (>= 2.1.2)
-
net8.0
- Pitasoft.FluentValidation (>= 2.0.2)
- Pitasoft.Result.AspNetCore (>= 2.1.2)
-
net9.0
- Pitasoft.FluentValidation (>= 2.0.2)
- Pitasoft.Result.AspNetCore (>= 2.1.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.