Skip to content

Forms and Validation in Blazor

Creating a Simple Form

Blazor makes it easy to create forms with two-way binding and submit events.

razor
<EditForm Model="@user" OnValidSubmit="HandleSubmit">
    <InputText id="name" @bind-Value="user.Name" />
    <button type="submit">Submit</button>
</EditForm>

@code {
    User user = new User();

    void HandleSubmit()
    {
        Console.WriteLine("Form submitted");
    }
}

Form Validation

Blazor includes support for validation using data annotation attributes (DataAnnotations).

csharp
public class User
{
    [Required(ErrorMessage = "Name is required")]
    [StringLength(50, MinimumLength = 2)]
    public string Name { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Range(18, 100)]
    public int Age { get; set; }
}

Complete Form Example

razor
<EditForm Model="@user" OnValidSubmit="HandleValidSubmit">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <div class="form-group">
        <label for="name">Name:</label>
        <InputText id="name" @bind-Value="user.Name" class="form-control" />
        <ValidationMessage For="@(() => user.Name)" />
    </div>

    <div class="form-group">
        <label for="email">Email:</label>
        <InputText id="email" @bind-Value="user.Email" class="form-control" />
        <ValidationMessage For="@(() => user.Email)" />
    </div>

    <div class="form-group">
        <label for="age">Age:</label>
        <InputNumber id="age" @bind-Value="user.Age" class="form-control" />
        <ValidationMessage For="@(() => user.Age)" />
    </div>

    <button type="submit" class="btn btn-primary">Submit</button>
</EditForm>

@code {
    private User user = new();

    private async Task HandleValidSubmit()
    {
        // Form is valid, process the data
        await SaveUserData(user);
    }
}

Built-in Form Components

InputText

razor
<InputText @bind-Value="model.Text" />

InputTextArea

razor
<InputTextArea @bind-Value="model.Description" />

InputNumber

razor
<InputNumber @bind-Value="model.Quantity" />

InputSelect

razor
<InputSelect @bind-Value="model.Category">
    <option value="">Select a category...</option>
    <option value="1">Category 1</option>
    <option value="2">Category 2</option>
</InputSelect>

InputDate

razor
<InputDate @bind-Value="model.Date" />

InputCheckbox

razor
<InputCheckbox @bind-Value="model.IsSubscribed" />

Custom Validation

You can implement custom validation using IValidatableObject:

csharp
public class RegistrationModel : IValidatableObject
{
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Password != ConfirmPassword)
        {
            yield return new ValidationResult(
                "Passwords do not match",
                new[] { nameof(Password), nameof(ConfirmPassword) }
            );
        }
    }
}

Form Events

razor
<EditForm Model="@model"
          OnValidSubmit="HandleValidSubmit"
          OnInvalidSubmit="HandleInvalidSubmit">
    <!-- Form fields -->
</EditForm>

@code {
    private async Task HandleValidSubmit()
    {
        // Handle valid form submission
    }

    private void HandleInvalidSubmit()
    {
        // Handle invalid form submission
    }
}