Sdílet prostřednictvím


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.

Vzory podnikových aplikací pomocí úvodní miniatury eBooku .NET MAUI

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.

Ověřovací třídy 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 LoginViewzařízení , při použití napodobení služeb. Delegát příkazu volá metodu MockSignInAsyncLoginViewModelv , 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 ValidateValidatableObject<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 UserNamePassword 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í.

Zobrazení chyb ověření během přihlášení

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ě Entrybudeme 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 Triggerssluž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.