Qualquer aplicativo que aceite entrada de usuários deve garantir que a entrada seja válida. Um aplicativo pode, por exemplo, verificar se a entrada que contém apenas caracteres em um intervalo específico, tem um determinado comprimento ou corresponde a um formato específico. Sem validação, um usuário pode fornecer dados que causam falha no aplicativo. A validação adequada impõe regras de negócio e pode ajudar a impedir que um invasor injete dados maliciosos. No contexto do padrão Model-View-ViewModel (MVVM), um Model ou ViewModel geralmente será necessário para executar a validação de dados e sinalizar quaisquer erros de validação para a View para que o usuário possa corrigi-los. A imagem abaixo mostra as classes envolvidas no processo de validação.
As propriedades do ViewModel que requerem validação são do tipo ValidatableObject<T> , e cadainstância ValidatableObject<T> tem regras de validação adicionadas à suapropriedade Validations . A validação é chamada do ViewModel chamando ométodo Validate dainstância ValidatableObject<T> , que recupera as regras de validação e as executa napropriedade ValidatableObject<T>.Value . Quaisquer erros de validação são colocados napropriedade Errors dainstância ValidatableObject<T> e apropriedade IsValid dainstância ValidatableObject<T> é atualizada para indicar se a validação foi bem-sucedida ou falhou. O código a seguir mostra a implementação do ValidatableObject<T> : Bloco de código |
---|
language | c# |
---|
theme | RDark |
---|
title | C# |
---|
| using CommunityToolkit.Mvvm.ComponentModel;
namespace RMLib.Validations;
public class ValidatableObject<T> : ObservableObject, IValidity
{
private IEnumerable<string> _errors;
private bool _isValid;
private T _value;
public List<IValidationRule<T>> Validations { get; } = new();
public IEnumerable<string> Errors
{
get => _errors;
private set => SetProperty(ref _errors, value);
}
public bool IsValid
{
get => _isValid;
private set => SetProperty(ref _isValid, value);
}
public T Value
{
get => _value;
set => SetProperty(ref _value, value);
}
public ValidatableObject()
{
_isValid = true;
_errors = Enumerable.Empty<string>();
}
public bool Validate()
{
Errors = Validations
?.Where(v => !v.Check(Value))
?.Select(v => v.ValidationMessage)
?.ToArray()
?? Enumerable.Empty<string>();
IsValid = !Errors.Any();
return IsValid;
}
} |
Clique para acessar o arquivo A notificação de alteração de propriedade é fornecida pelaclasse ObservableObject e, portanto, umcontrole Entry pode se vincular àpropriedade IsValid dainstância ValidatableObject<T> na classe do ViewModel para ser notificado se os dados inseridos são válidos ou não. |