Skip to main content

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>());

Resources