Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Napiwek
Ta zawartość jest fragmentem książki eBook, wzorców aplikacji dla przedsiębiorstw przy użyciu platformy .NET, dostępnej na platformie .NET MAUIDocs lub jako bezpłatnego pliku PDF do pobrania, który można odczytać w trybie offline.
Każda aplikacja, która akceptuje dane wejściowe od użytkowników, powinna upewnić się, że dane wejściowe są prawidłowe. Aplikacja może na przykład sprawdzić, czy dane wejściowe zawierają tylko znaki w określonym zakresie, ma określoną długość lub pasują do określonego formatu. Bez walidacji użytkownik może podać dane, które powodują niepowodzenie aplikacji. Prawidłowa weryfikacja wymusza reguły biznesowe i może pomóc zapobiec wstrzyknięciu złośliwych danych przez osobę atakującą.
W kontekście wzorca Model-View-ViewModel (MVVM) model widoku lub model często będzie wymagany do przeprowadzenia walidacji danych i zasygnalizować wszelkie błędy weryfikacji w widoku, aby użytkownik mógł je poprawić. Aplikacja wieloplatformowa eShop przeprowadza synchroniczną walidację właściwości modelu widoku po stronie klienta i powiadamia użytkownika o wszelkich błędach walidacji, wyróżniając kontrolkę zawierającą nieprawidłowe dane oraz wyświetlając komunikaty o błędach informujące użytkownika o tym, dlaczego dane są nieprawidłowe. Na poniższej ilustracji przedstawiono klasy związane z wykonywaniem walidacji w aplikacji wieloplatformowej eShop.
Wyświetl właściwości modelu, które wymagają weryfikacji, są typu ValidatableObject<T>
, a każde ValidatableObject<T>
wystąpienie ma reguły sprawdzania poprawności dodane do jego Validations
właściwości. Walidacja jest wywoływana z modelu widoku przez wywołanie Validate
metody ValidatableObject<T>
wystąpienia, która pobiera reguły walidacji i wykonuje je względem ValidatableObject<T>.Value
właściwości . Wszelkie błędy walidacji są umieszczane we Errors
właściwości ValidatableObject<T>
wystąpienia, a IsValid
właściwość ValidatableObject<T>
wystąpienia jest aktualizowana w celu wskazania, czy walidacja zakończyła się pomyślnie, czy nie powiodła się. Poniższy kod przedstawia implementację elementu ValidatableObject<T>
:
using CommunityToolkit.Mvvm.ComponentModel;
namespace eShop.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;
}
}
Powiadomienie o zmianie właściwości jest dostarczane przez ObservableObject
klasę, dlatego kontrolka może powiązać z Entry
właściwością IsValid
ValidatableObject<T>
wystąpienia w klasie modelu widoku, aby otrzymywać powiadomienia o tym, czy wprowadzone dane są prawidłowe.
Określanie reguł walidacji
Reguły walidacji są określane przez utworzenie klasy pochodzącej z interfejsu IValidationRule<T>
, która jest pokazana w poniższym przykładzie kodu:
public interface IValidationRule<T>
{
string ValidationMessage { get; set; }
bool Check(T value);
}
Ten interfejs określa, że klasa reguły walidacji musi dostarczyć metodę logiczną Check
używaną do przeprowadzania wymaganej weryfikacji, a ValidationMessage
właściwość, której wartość jest komunikatem o błędzie weryfikacji, który będzie wyświetlany w przypadku niepowodzenia walidacji.
Poniższy przykład kodu przedstawia regułę IsNotNullOrEmptyRule<T>
weryfikacji, która służy do sprawdzania poprawności nazwy użytkownika i hasła wprowadzonego przez użytkownika LoginView
podczas korzystania z usług pozorowania w aplikacji wieloplatformowej eShop:
public class IsNotNullOrEmptyRule<T> : IValidationRule<T>
{
public string ValidationMessage { get; set; }
public bool Check(T value) =>
value is string str && !string.IsNullOrWhiteSpace(str);
}
Metoda Check
zwraca wartość logiczną wskazującą, czy argument wartości ma wartość null, pustą lub składa się tylko z znaków białych.
Mimo że nie jest używana przez aplikację wieloplatformową eShop, poniższy przykład kodu przedstawia regułę sprawdzania poprawności na potrzeby sprawdzania poprawności adresów e-mail:
public class EmailRule<T> : IValidationRule<T>
{
private readonly Regex _regex = new(@"^([w.-]+)@([w-]+)((.(w){2,3})+)$");
public string ValidationMessage { get; set; }
public bool Check(T value) =>
value is string str && _regex.IsMatch(str);
}
Metoda Check
zwraca wartość logiczną wskazującą, czy argument wartości jest prawidłowym adresem e-mail. Jest to osiągane przez wyszukanie argumentu wartości dla pierwszego wystąpienia wzorca wyrażenia regularnego określonego w konstruktorze Regex
. Czy wzorzec wyrażenia regularnego został znaleziony w ciągu wejściowym, można określić, sprawdzając value
element względem Regex.IsMatchelementu .
Uwaga
Walidacja właściwości może czasami obejmować właściwości zależne. Przykładem właściwości zależnych jest, gdy zestaw prawidłowych wartości właściwości A zależy od określonej wartości ustawionej we właściwości B. Aby sprawdzić, czy wartość właściwości A jest jedną z dozwolonych wartości, wymaga pobierania wartości właściwości B. Ponadto, gdy wartość właściwości B ulegnie zmianie, właściwość A musi zostać ponownie odnowiona.
Dodawanie reguł walidacji do właściwości
W aplikacji wieloplatformowej eShop wyświetl właściwości modelu, które wymagają weryfikacji, są deklarowane jako typu ValidatableObject<T>
, gdzie T
jest typem danych do zweryfikowania. Poniższy przykład kodu przedstawia przykład dwóch takich właściwości:
public ValidatableObject<string> UserName { get; private set; }
public ValidatableObject<string> Password { get; private set; }
Aby można było przeprowadzić walidację, reguły weryfikacji należy dodać do kolekcji Walidacje każdego ValidatableObject<T>
wystąpienia, jak pokazano w poniższym przykładzie kodu:
private void AddValidations()
{
UserName.Validations.Add(new IsNotNullOrEmptyRule<string>
{
ValidationMessage = "A username is required."
});
Password.Validations.Add(new IsNotNullOrEmptyRule<string>
{
ValidationMessage = "A password is required."
});
}
Ta metoda dodaje regułę IsNotNullOrEmptyRule<T>
sprawdzania poprawności do Validations
kolekcji każdego ValidatableObject<T>
wystąpienia, określając wartości właściwości reguły ValidationMessage
walidacji, która określa komunikat o błędzie weryfikacji, który będzie wyświetlany w przypadku niepowodzenia walidacji.
Wyzwalanie walidacji
Metoda sprawdzania poprawności używana w aplikacji wieloplatformowej eShop może ręcznie wyzwolić walidację właściwości i automatycznie wyzwolić walidację po zmianie właściwości.
Ręczne wyzwalanie walidacji
Walidacja może być wyzwalana ręcznie dla właściwości modelu widoku. Na przykład występuje to w aplikacji wieloplatformowej eShop, gdy użytkownik naciągnie Login
przycisk na LoginView
, podczas korzystania z pozornych usług. Delegat polecenia wywołuje metodę MockSignInAsync
w LoginViewModel
obiekcie , która wywołuje walidację, wykonując Validate
metodę, która jest pokazana w poniższym przykładzie kodu:
private bool Validate()
{
bool isValidUser = ValidateUserName();
bool isValidPassword = ValidatePassword();
return isValidUser && isValidPassword;
}
private bool ValidateUserName()
{
return _userName.Validate();
}
private bool ValidatePassword()
{
return _password.Validate();
}
Metoda Validate
przeprowadza walidację nazwy użytkownika i hasła wprowadzonego przez użytkownika w elemecie LoginView
, wywołując metodę Validate
w każdym ValidatableObject<T>
wystąpieniu. Poniższy przykład kodu przedstawia metodę Validate
ValidatableObject<T>
z klasy :
public bool Validate()
{
Errors = _validations
?.Where(v => !v.Check(Value))
?.Select(v => v.ValidationMessage)
?.ToArray()
?? Enumerable.Empty<string>();
IsValid = !Errors.Any();
return IsValid;
}
Ta metoda pobiera wszystkie reguły walidacji dodane do kolekcji obiektu Validations
. Metoda Check
dla każdej pobranej reguły walidacji jest wykonywana, a ValidationMessage
wartość właściwości dla każdej reguły sprawdzania poprawności, która nie może zweryfikować, czy dane są dodawane do Errors
kolekcji ValidatableObject<T>
wystąpienia.
IsValid
Na koniec właściwość jest ustawiona, a jej wartość jest zwracana do metody wywołującej, wskazując, czy walidacja zakończyła się pomyślnie, czy nie powiodła się.
Wyzwalanie walidacji po zmianie właściwości
Walidacja jest również wyzwalana automatycznie za każdym razem, gdy zmienia się powiązana właściwość. Na przykład po wyzwoleniu powiązania dwukierunkowego w ustawianiu LoginView
UserName
właściwości lub Password
jest wyzwalana walidacja. W poniższym przykładzie kodu pokazano, jak to się dzieje:
<Entry Text="{Binding UserName.Value, Mode=TwoWay}">
<Entry.Behaviors>
<behaviors:EventToCommandBehavior
EventName="TextChanged"
Command="{Binding ValidateUserNameCommand}" />
</Entry.Behaviors>
</Entry>
Kontrolka Entry
wiąże się z UserName.Value
właściwością ValidatableObject<T>
wystąpienia, a kolekcja kontrolki Behaviors
ma EventToCommandBehavior
dodane do niego wystąpienie. To zachowanie wykonuje ValidateUserNameCommand
element w odpowiedzi na TextChanged
zdarzenie uruchamiane na Entry
obiekcie , który jest zgłaszany podczas wprowadzania tekstu w Entry
zmianach. Z kolei ValidateUserNameCommand
delegat wykonuje metodę ValidateUserName
, która wykonuje Validate
metodę w wystąpieniu ValidatableObject<T>
. W związku z tym za każdym razem, gdy użytkownik wprowadza znak w kontrolce Entry
dla nazwy użytkownika, wykonywana jest walidacja wprowadzonych danych.
Wyświetlanie błędów walidacji
Aplikacja wieloplatformowa eShop powiadamia użytkownika o wszelkich błędach walidacji, wyróżniając kontrolkę zawierającą nieprawidłowe dane z czerwonym tłem oraz wyświetlając komunikat o błędzie informujący użytkownika, dlaczego dane są nieprawidłowe poniżej kontrolki zawierającej nieprawidłowe dane. Po skorygowaniu nieprawidłowych danych tło zmieni się z powrotem na stan domyślny, a komunikat o błędzie zostanie usunięty. Na poniższej ilustracji przedstawiono LoginView
w aplikacji wieloplatformowej eShop, gdy występują błędy walidacji.
Wyróżnianie kontrolki zawierającej nieprawidłowe dane
Platforma .NET MAUI oferuje wiele sposobów prezentowania informacji dotyczących walidacji użytkownikom końcowym, ale jednym z najbardziej prostych sposobów jest użycie usługi Triggers
.
Triggers
udostępniają nam sposób zmiany stanu kontrolek, zwykle w przypadku wyglądu, na podstawie zdarzenia lub zmiany danych, która występuje dla kontrolki. W celu weryfikacji użyjemy elementu DataTrigger
, który będzie nasłuchiwać zmian zgłoszonych z powiązanej właściwości i odpowiadać na zmiany. Kontrolki Entry
w elemecie LoginView
są konfigurowane przy użyciu następującego kodu:
<Entry Text="{Binding UserName.Value, Mode=TwoWay}">
<Entry.Style>
<OnPlatform x:TypeArguments="Style">
<On Platform="iOS, Android" Value="{StaticResource EntryStyle}" />
<On Platform="WinUI" Value="{StaticResource WinUIEntryStyle}" />
</OnPlatform>
</Entry.Style>
<Entry.Behaviors>
<mct:EventToCommandBehavior
EventName="TextChanged"
Command="{Binding ValidateCommand}" />
</Entry.Behaviors>
<Entry.Triggers>
<DataTrigger
TargetType="Entry"
Binding="{Binding UserName.IsValid}"
Value="False">
<Setter Property="BackgroundColor" Value="{StaticResource ErrorColor}" />
</DataTrigger>
</Entry.Triggers>
</Entry>
Właściwość DataTrigger
określa następujące właściwości:
Właściwości | opis |
---|---|
TargetType |
Typ kontrolki, do którego należy wyzwalacz. |
Binding |
Znaczniki danych Binding , które zapewnią powiadomienia o zmianie i wartość warunku wyzwalacza. |
Value |
Wartość danych do określenia, kiedy warunek wyzwalacza został spełniony. |
W tym Entry
przypadku nasłuchujemy zmian LoginViewModel.UserName.IsValid
właściwości. Za każdym razem, gdy ta właściwość zgłasza zmianę, wartość zostanie porównana z właściwością ustawioną Value
w obiekcie DataTrigger
. Jeśli wartości są równe, warunek wyzwalacza zostanie spełniony, a wszystkie Setter
obiekty dostarczone do obiektu DataTrigger
zostaną wykonane. Ta kontrolka ma pojedynczy Setter
obiekt, który aktualizuje BackgroundColor
właściwość do niestandardowego koloru zdefiniowanego StaticResource
przy użyciu znaczników.
Trigger
Gdy warunek nie zostanie już spełniony, kontrolka przywróci właściwości ustawione przez obiekt do ich poprzedniego Setter
stanu. Aby uzyskać więcej informacji na temat Triggers
programu , zobacz .NET Docs: Triggers (Dokumentacja platformy .NET MAUI : wyzwalacze).
Wyświetlanie komunikatów o błędach
Interfejs użytkownika wyświetla komunikaty o błędach walidacji w kontrolkach Etykieta poniżej każdej kontrolki, której weryfikacja danych nie powiodła się. Poniższy przykład kodu przedstawia Label
komunikat o błędzie weryfikacji, jeśli użytkownik nie wprowadził prawidłowej nazwy użytkownika:
<Label
Text="{Binding UserName.Errors, Converter={StaticResource FirstValidationErrorConverter}"
Style="{StaticResource ValidationErrorLabelStyle}" />
Każda etykieta wiąże się z właściwością Errors
obiektu modelu widoku, który jest weryfikowany. Właściwość Errors
jest dostarczana przez klasę ValidatableObject<T>
i jest typu IEnumerable<string>
.
Errors
Ponieważ właściwość może zawierać wiele błędów walidacji, FirstValidationErrorConverter
wystąpienie jest używane do pobierania pierwszego błędu z kolekcji na potrzeby wyświetlania.
Podsumowanie
Aplikacja wieloplatformowa eShop przeprowadza synchroniczną walidację właściwości modelu widoku po stronie klienta i powiadamia użytkownika o wszelkich błędach walidacji, wyróżniając kontrolkę zawierającą nieprawidłowe dane oraz wyświetlając komunikaty o błędach informujące użytkownika, dlaczego dane są nieprawidłowe.
Wyświetl właściwości modelu, które wymagają weryfikacji, są typu ValidatableObject<T>
, a każde ValidatableObject<T>
wystąpienie ma reguły sprawdzania poprawności dodane do jego Validations
właściwości. Walidacja jest wywoływana z modelu widoku przez wywołanie Validate
metody ValidatableObject<T>
wystąpienia, która pobiera reguły walidacji i wykonuje je względem ValidatableObject<T>
właściwości Value. Wszelkie błędy walidacji są umieszczane we Errors
właściwości ValidatableObject<T>
wystąpienia, a właściwość ValidatableObject<T>
IsValid wystąpienia jest aktualizowana w celu wskazania, czy walidacja zakończyła się powodzeniem, czy niepowodzeniem.