Roadmap › ASP.NET Core MVC (and Razor Pages) › Module: Models, Binding and Validation
Lessons in this course (15)

6. Validation with data annotations

Basic★ Must knowLesson 6 of 15
csharp
public class ProductInput
{
    [Required, StringLength(100, MinimumLength = 3)]
    public string Name { get; set; } = "";

    [Range(1, 1_000_000)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    [EmailAddress] public string? SupplierEmail { get; set; }
    [RegularExpression(@"^[A-Z]{3}-\d{4}$", ErrorMessage = "SKU must look like ABC-1234")]
    public string Sku { get; set; } = "";

    [Remote(action: "SkuAvailable", controller: "Products")]   // AJAX check via jQuery unobtrusive validation
    public string? Code { get; set; }
}
  • Server-side: ModelState.IsValid (always check — client validation can be bypassed).
  • Client-side: jQuery Validation + Unobtrusive (_ValidationScriptsPartial) reads data-val-* attributes generated by tag helpers.
  • Custom rules: a ValidationAttribute subclass or IValidatableObject.Validate() for cross-field rules; FluentValidation library for complex rules.
  • Add errors manually: ModelState.AddModelError(nameof(input.Sku), "SKU already exists");