Validation via special model validators

By default, Catel registers the AttributeValidatorProvider as the IValidatorProvider. This way the ModelBase and all the classes that derive from it can easily add a custom validator by using the ValidateModelAttribute.

Note that it is still possible to register a custom IValidatorProvider to customize this behavior. It is even possible to set the Validator property of the ModelBase on a specific instance of a model

Implementing the validator

The first thing that needs to be done is to write a custom implementation of the IValidator interface. You can either implement all the members yourself or derive from *ValidatorBase *as is shown below:

public class PersonValidator : ValidatorBase<PersonModel>
{
    protected override void ValidateFields(PersonModel instance, List<IFieldValidationResult> validationResults)
    {
        if (string.IsNullOrWhiteSpace(instance.FirstName))
        {
            validationResults.Add(FieldValidationResult.CreateError(PersonModel.FirstNameProperty, "First name is required"));
        }
 
        if (string.IsNullOrWhiteSpace(instance.LastName))
        {
            validationResults.Add(FieldValidationResult.CreateError(PersonModel.FirstNameProperty, "First name is required"));
        }
    }
 
    protected override void ValidateBusinessRules(PersonModel instance, List<IBusinessRuleValidationResult> validationResults)
    {
        // No business rules validations yet
    }
}

Decorating a model with the attribute

Once a validator is available, the only thing that needs to be done is to decorate the model with the ValidateModelAttribute:

[ValidateModel(typeof(PersonValidator))]
public class PersonModel : ModelBase
{
    public string FirstName
    {
        get { return GetValue<string>(FirstNameProperty); }
        set { SetValue(FirstNameProperty, value); }
    }

    public static readonly PropertyData FirstNameProperty = RegisterProperty("FirstName", typeof(string), string.Empty);

    public string LastName
    {
        get { return GetValue<string>(LastNameProperty); }
        set { SetValue(LastNameProperty, value); }
    }

    public static readonly PropertyData LastNameProperty = RegisterProperty("LastName", typeof(string), string.Empty);
}

The custom validator will now automatically be called.


Have a question about Catel? Use StackOverflow with the Catel tag!


Discussion