Validazione

Per aggiungere validazioni complesse installare il package Microsoft.AspNetCore.Components.DataAnnotations.Validation.

Per attivare il nuovo validatore è necessario sostituire il classico DataAnnotationsValidator, presente come tag subito sotto la EditForm, con il ObjectGraphDataAnnotationsValidator.

Per validare strutture complesse:

public class Employee
{
    public int Id {get; set;}
    [Required]
    public string Name {get; set;}
    [ValidateComplexType]
    public Address Address {get; set;}
}

In questo modo se il tipo Address contiene dei campi con dei Required verranno correttamente valutati nella form quando verranno inseriti come:

<ValidationMessage for="(() => context.Address.City)" />

senza il ValidateComplexType il sistema li ignorerebbe senza alcun messaggio o validazione.

Validatori Custom

Per aggiungere una validazione custom per la maggiore età:

public class BirthdayValidator: ValidationAttribute
{
    public int MinimumAge {get; set;}

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        DateTime birthDate;
        if (DateTime.TryParse(value.ToString(), out birthDate))
        {
            if (birthDate < DateTime.Now.AddYears(MinimumAge * -1))
            {
                return null;
            }
            else
            {
                return new ValidationResult($"Employee must be at least {MinimumAge}.", new[] { validationContext.MemberName });
            }
        }

        return new ValidationResult("Invalid birth date.", new [] { validationContext.MemberName });
    }
}

utilizzo:

...
[BirthdayValidator(MinimumAge = 18)]
public DateTime BirthDate {get; set;}

Model Level Validation

Esempio per Longitudine e Latitudine.

Per prima cosa è necessario derivare la classe dall’interfaccia IValidatableObject, quindi:

public class Address: IValidatableObject
{

}

poi è necessario implementare l’interfaccia attraverso il metodo previsto:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    var errors = new List<ValidationResult>();

    if (Latitude != 0 && Longitude == 0) 
    {
        errors.Add(new ValidationResult( "Longitude is required if Latitude has a value.",
        new [] {nameof(Longitude)}));
    }
    else if 
    ...
}