Model Binding & Validation
Model Binding Sources
// From route
app.MapGet("/products/{id}", (int id) => { });
// From query string
app.MapGet("/products", (int page, int size) => { });
// From body
app.MapPost("/products", (Product product) => { });
// From header
app.MapGet("/", ([FromHeader(Name = "X-API-Key")] string apiKey) => { });
// From services
app.MapGet("/", (IProductService service) => { });
Data Annotations
public class CreateProductRequest
{
[Required(ErrorMessage = "Name is required")]
[StringLength(100, MinimumLength = 3)]
public string Name { get; set; }
[Range(0.01, 10000)]
public decimal Price { get; set; }
[EmailAddress]
public string ContactEmail { get; set; }
}
Automatic Validation
[ApiController] // Enables automatic model validation
public class ProductsController : ControllerBase
{
[HttpPost]
public IActionResult Create(CreateProductRequest request)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
// Process valid model
}
}
FluentValidation
public class CreateProductValidator : AbstractValidator<CreateProductRequest>
{
public CreateProductValidator()
{
RuleFor(x => x.Name)
.NotEmpty()
.Length(3, 100);
RuleFor(x => x.Price)
.GreaterThan(0)
.LessThanOrEqualTo(10000);
}
}
// Registration
builder.Services.AddFluentValidation(fv =>
fv.RegisterValidatorsFromAssemblyContaining<CreateProductValidator>());