Automatically bind and validate models with FluentValidation on ASP.NET
NuGet package available:
$ dotnet add package ValidatedModel.FluentValidation
using FluentValidation;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddValidatorsFromAssemblyContaining<PersonValidator>();
var app = builder.Build();
var api = app.MapGroup("api")
// Enable validation filter
// Automatically validate Validated<T> parameters
.AddFluentValidationFilter();
// Returns validation problems if validation fail
api.MapPost("/person", (Validated<Person> person) => $"Hello {person.Value.Name}");
// using attribute only
api.MapPost("/person-simple", ([Validate] Person person) => $"Hello {person.Name}");
// Skipping auto validation
api.MapPost("/person-manual", (ILogger<Program> logger, [ManualValidation] Validated<Person> person) =>
{
if (!person.IsValid)
{
logger.LogInformation("Validation: {Errors}", JsonSerializer.Serialize(person.Errors));
return Results.BadRequest();
}
return $"Hello {person.Value.Name}";
});
app.Run();
public class Person
{
public required string Name { get; init; }
public required int Age { get; init; }
}
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(p => p.Name).NotEmpty();
RuleFor(p => p.Age).GreaterThanOrEqualTo(18);
}
}