Ověřování
Tip
Tento obsah je výňatek z elektronické knihy, vzory podnikových aplikací pomocí .NET MAUI, dostupné na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.
Každá aplikace, která přijímá vstup od uživatelů, by se měla ujistit, že vstup je platný. Aplikace může například zkontrolovat vstup, který obsahuje pouze znaky v určitém rozsahu, má určitou délku nebo odpovídá určitému formátu. Bez ověření může uživatel zadat data, která způsobí selhání aplikace. Správné ověření vynucuje obchodní pravidla a může pomoct útočníkovi vkládat škodlivá data.
V kontextu modelu Model-View-ViewModel (MVVM) se model zobrazení nebo model často vyžaduje k ověření dat a k označení všech chyb ověření do zobrazení, aby je uživatel mohl opravit. Multiplatformní aplikace eShop provádí synchronní ověření vlastností modelu zobrazení na straně klienta a upozorní uživatele na případné chyby ověření zvýrazněním ovládacího prvku, který obsahuje neplatná data, a zobrazením chybových zpráv, které uživatele informují o tom, proč jsou data neplatná. Následující obrázek ukazuje třídy, které se týkají ověřování v multiformní aplikaci eShop.
Umožňuje zobrazit vlastnosti modelu, které vyžadují ověření typu ValidatableObject<T>
, a každá ValidatableObject<T>
instance má do své Validations
vlastnosti přidaná ověřovací pravidla. Ověření se vyvolá z modelu zobrazení voláním Validate
metody ValidatableObject<T>
instance, která načte ověřovací pravidla a provede je proti ValidatableObject<T>.Value
vlastnosti. Všechny chyby ověření jsou umístěny do Errors
vlastnosti ValidatableObject<T>
instance a IsValid
vlastnost ValidatableObject<T>
instance je aktualizována tak, aby indikovala, zda ověření proběhlo úspěšně nebo selhalo. Následující kód ukazuje implementaci 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;
}
}
Oznámení o změně vlastnosti je poskytováno ObservableObject
třídou, a proto Entry
může ovládací prvek vytvořit vazbu na IsValid
vlastnost ValidatableObject<T>
instance ve třídě modelu zobrazení, aby byla upozorněna na to, zda jsou zadaná data platná nebo ne.
Určení ověřovacích pravidel
Ověřovací pravidla jsou určena vytvořením třídy, která je odvozena z IValidationRule<T>
rozhraní, což je znázorněno v následujícím příkladu kódu:
public interface IValidationRule<T>
{
string ValidationMessage { get; set; }
bool Check(T value);
}
Toto rozhraní určuje, že třída ověřovacího pravidla musí poskytovat logickou Check
metodu, která se používá k provedení požadovaného ověření, a ValidationMessage
vlastnost, jejíž hodnota je ověřovací chybová zpráva, která se zobrazí, pokud ověření selže.
Následující příklad kódu ukazuje IsNotNullOrEmptyRule<T>
ověřovací pravidlo, které slouží k ověření uživatelského jména a hesla zadaného uživatelem LoginView
při použití napodobení služeb v aplikaci eShop pro více platforem:
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
vrátí logickou hodnotu označující, zda je argument hodnota null, prázdný nebo se skládá pouze z prázdných znaků.
I když aplikace eShop pro více platforem nepoužívá, následující příklad kódu ukazuje ověřovací pravidlo pro ověřování e-mailových adres:
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
vrátí logickou hodnotu označující, zda je argument hodnota platnou e-mailovou adresou. Toho dosáhnete vyhledáním argumentu hodnoty prvního výskytu vzoru regulárního výrazu zadaného v konstruktoru Regex
. Zda byl v vstupním řetězci nalezen vzor regulárního výrazu, lze určit kontrolou value
proti Regex.IsMatch.
Poznámka:
Ověření vlastnosti může někdy zahrnovat závislé vlastnosti. Příkladem závislých vlastností je, když sada platných hodnot pro vlastnost A závisí na konkrétní hodnotě, která byla nastavena ve vlastnosti B. Chcete-li zkontrolovat, zda hodnota vlastnosti A je jednou z povolených hodnot, by zahrnoval načtení hodnoty vlastnosti B. Kromě toho, když hodnota vlastnosti B změní, vlastnost A bude nutné znovu aktualizovat.
Přidání ověřovacích pravidel do vlastnosti
V aplikaci pro více platforem eShop zobrazte vlastnosti modelu, které vyžadují ověření, jsou deklarovány jako typ ValidatableObject<T>
, kde T
je typ dat, která se mají ověřit. Následující příklad kódu ukazuje příklad dvou takových vlastností:
public ValidatableObject<string> UserName { get; private set; }
public ValidatableObject<string> Password { get; private set; }
Aby mohlo dojít k ověření, musí být ověřovací pravidla přidána do kolekce Ověření každé ValidatableObject<T>
instance, jak je znázorněno v následujícím příkladu kódu:
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."
});
}
Tato metoda přidá IsNotNullOrEmptyRule<T>
ověřovací pravidlo do Validations
kolekce každé ValidatableObject<T>
instance a určuje hodnoty pro vlastnost ověřovacího pravidla ValidationMessage
, která určuje chybovou zprávu ověření, která se zobrazí v případě selhání ověření.
Aktivace ověřování
Ověřovací přístup použitý v aplikaci pro více platforem eShopu může ručně aktivovat ověření vlastnosti a automaticky aktivovat ověření při změně vlastnosti.
Ruční aktivace ověřování
Ověření lze aktivovat ručně pro vlastnost modelu zobrazení. K tomu například dochází v aplikaci eShop pro více platforem, když uživatel klepne na Login
tlačítko na LoginView
zařízení , při použití napodobení služeb. Delegát příkazu volá metodu MockSignInAsync
LoginViewModel
v , která vyvolá ověření spuštěním Validate
metody, která je znázorněna v následujícím příkladu kódu:
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
provádí ověření uživatelského jména a hesla zadaného uživatelem v aplikaci LoginView
, vyvoláním Validate
metody v každé ValidatableObject<T>
instanci. Následující příklad kódu ukazuje metodu Validate
ValidatableObject<T>
z třídy:
public bool Validate()
{
Errors = _validations
?.Where(v => !v.Check(Value))
?.Select(v => v.ValidationMessage)
?.ToArray()
?? Enumerable.Empty<string>();
IsValid = !Errors.Any();
return IsValid;
}
Tato metoda načte všechna ověřovací pravidla, která byla přidána do kolekce objektu Validations
. Spustí se Check
metoda pro každé načtené ověřovací pravidlo a ValidationMessage
hodnota vlastnosti pro každé ověřovací pravidlo, které se nepodaří ověřit data, se přidají do Errors
kolekce ValidatableObject<T>
instance. IsValid
Nakonec je vlastnost nastavena a její hodnota je vrácena volající metodě označující, zda ověření bylo úspěšné nebo neúspěšné.
Aktivace ověření při změně vlastností
Ověření se také aktivuje automaticky při každé změně vázané vlastnosti. Pokud například obousměrná vazba v LoginView
sadě nebo UserName
Password
vlastnosti nastaví, aktivuje se ověření. Následující příklad kódu ukazuje, jak k tomu dochází:
<Entry Text="{Binding UserName.Value, Mode=TwoWay}">
<Entry.Behaviors>
<behaviors:EventToCommandBehavior
EventName="TextChanged"
Command="{Binding ValidateUserNameCommand}" />
</Entry.Behaviors>
</Entry>
Ovládací Entry
prvek vytvoří vazbu na UserName.Value
vlastnost ValidatableObject<T>
instance a kolekce ovládacího prvku Behaviors
má přidanou EventToCommandBehavior
instanci. Toto chování spustí ValidateUserNameCommand
v reakci TextChanged
na událost, která se aktivuje na objektu Entry
, který se vyvolá při změně textu Entry
. Delegát pak ValidateUserNameCommand
spustí metodu ValidateUserName
, která spustí metodu Validate
v ValidatableObject<T>
instanci. Proto se při každém zadání znaku v ovládacím Entry
prvku pro uživatelské jméno provede ověření zadaných dat.
Zobrazení chyb ověření
Multiplatformní aplikace eShop upozorní uživatele na případné chyby ověření zvýrazněním ovládacího prvku, který obsahuje neplatná data s červeným pozadím, a zobrazením chybové zprávy, která informuje uživatele o tom, proč jsou data neplatná pod ovládacím prvku obsahujícím neplatná data. Při opravě neplatných dat se pozadí změní zpět na výchozí stav a chybová zpráva se odebere. Následující obrázek znázorňuje LoginView
v aplikaci eShop pro více platforem, když se zobrazí chyby ověřování.
Zvýraznění ovládacího prvku, který obsahuje neplatná data
.NET MAUI nabízí řadu způsobů, jak koncovým uživatelům prezentovat ověřovací informace, ale jedním z nejpřímějších způsobů je použití Triggers
. Triggers
poskytuje způsob, jak změnit stav našich ovládacích prvků, obvykle pro vzhled na základě události nebo změny dat, ke kterým u ovládacího prvku dochází. K ověření použijeme funkci DataTrigger
, která bude naslouchat změnám vyvolaným z vázané vlastnosti a reagovat na změny. Ovládací Entry
prvky v instalačním programu LoginView
používají následující kód:
<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>
Určuje DataTrigger
následující vlastnosti:
Vlastnost | Popis |
---|---|
TargetType |
Typ ovládacího prvku, ke kterému aktivační událost patří. |
Binding |
Kód dat Binding , který bude poskytovat oznámení o změnách a hodnotu pro podmínku triggeru. |
Value |
Datová hodnota, která se má určit, kdy byla splněna podmínka triggeru. |
V tomto případě Entry
budeme naslouchat změnám vlastnosti LoginViewModel.UserName.IsValid
. Pokaždé, když tato vlastnost vyvolá změnu, bude hodnota porovnána s vlastností nastavenou Value
v objektu DataTrigger
. Pokud jsou hodnoty stejné, bude splněna podmínka triggeru a všechny Setter
objekty zadané do objektu DataTrigger
budou provedeny. Tento ovládací prvek má jeden Setter
objekt, který aktualizuje BackgroundColor
vlastnost na vlastní barvu definovanou pomocí revizí StaticResource
. Trigger
Pokud podmínka již není splněna, ovládací prvek vrátí vlastnosti nastavené objektem Setter
do předchozího stavu. Další informace o Triggers
službě . NET MAUI Docs: Triggery.
Zobrazování chybových zpráv
Uživatelské rozhraní zobrazuje chybové zprávy ověřování v ovládacích prvcích Popisek pod každým ovládacím prvku, jehož data selhala při ověřování. Následující příklad kódu ukazuje Label
, že se zobrazí chybová zpráva ověření, pokud uživatel nezadali platné uživatelské jméno:
<Label
Text="{Binding UserName.Errors, Converter={StaticResource FirstValidationErrorConverter}"
Style="{StaticResource ValidationErrorLabelStyle}" />
Každý popisek vytvoří vazbu na Errors
vlastnost objektu modelu zobrazení, který se ověřuje. Vlastnost Errors
je poskytována ValidatableObject<T>
třídou a je typu IEnumerable<string>
. Errors
Protože vlastnost může obsahovat více chyb ověření, FirstValidationErrorConverter
instance se používá k načtení první chyby z kolekce pro zobrazení.
Shrnutí
Multiplatformní aplikace eShop provádí synchronní ověření vlastností modelu na straně klienta a upozorní uživatele na případné chyby ověření zvýrazněním ovládacího prvku, který obsahuje neplatná data, a zobrazením chybových zpráv, které uživatele informují o tom, proč jsou data neplatná.
Umožňuje zobrazit vlastnosti modelu, které vyžadují ověření typu ValidatableObject<T>
, a každá ValidatableObject<T>
instance má do své Validations
vlastnosti přidaná ověřovací pravidla. Ověření se vyvolá z modelu zobrazení voláním Validate
metody ValidatableObject<T>
instance, která načte ověřovací pravidla a provede je proti ValidatableObject<T>
vlastnosti Value. Všechny chyby ověření jsou umístěny do Errors
vlastnosti ValidatableObject<T>
instance a IsValid vlastnost ValidatableObject<T>
instance je aktualizována tak, aby indikovala, zda ověření proběhlo úspěšně nebo selhalo.