@page "/"
@using Microsoft.Extensions.Logging
@inject ILogger<Index> Logger
@using System.ComponentModel.DataAnnotations
<EditForm Model="@exampleModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label>
From Date:
<InputDate @bind-Value="exampleModel.FromDate" />
</label>
<ValidationMessage For="() => exampleModel.FromDate" />
</p>
<p>
<label>
To Date:
<InputDate @bind-Value="exampleModel.ToDate" />
</label>
<ValidationMessage For="() => exampleModel.ToDate" />
</p>
<button type="submit">Submit</button>
</EditForm>
@code {
private DateTimeModel exampleModel = new DateTimeModel();
private void HandleValidSubmit()
{
Logger.LogInformation("HandleValidSubmit called");
// Process the valid form
}
public class DateTimeModel
{
[Required]
[DateMustBeAfter(nameof(FromDate))]
[DataType(DataType.Date)]
public DateTime? FromDate { get; set; }
[Required]
[DateMustBeAfter(nameof(FromDate))]
[DataType(DataType.Date)]
public DateTime? ToDate { get; set; }
}
public class DateMustBeAfterAttribute : ValidationAttribute
{
public DateMustBeAfterAttribute(string propertyName)
=> PropertyName = propertyName;
public string PropertyName { get; }
public string GetErrorMessage() =>
$"Date must be after {PropertyName}.";
protected override ValidationResult? IsValid(
object? value, ValidationContext validationContext)
{
var model = (DateTimeModel)validationContext.ObjectInstance;
if ((DateTime?)value < (DateTime?)model.GetType().GetProperty(PropertyName)?.GetValue(model, null))
{
return new ValidationResult(GetErrorMessage());
}
return ValidationResult.Success;
}
}
}