Aracılığıyla paylaş


Doğrulama

Kullanıcıların girişini kabul eden tüm uygulamalar girişin geçerli olduğundan emin olmalıdır. Örneğin bir uygulama, yalnızca belirli bir aralıktaki karakterleri içeren, belirli bir uzunlukta veya belirli bir biçimle eşleşen giriş olup olmadığını denetleyebilir. Doğrulama olmadan, bir kullanıcı uygulamanın başarısız olmasına neden olan verileri sağlayabilir. Doğru doğrulama, iş kurallarını zorunlu kılar ve saldırganın kötü amaçlı veri eklemesini önlemeye yardımcı olabilir.

Model-View-ViewModel (MVVM) deseni bağlamında, veri doğrulama gerçekleştirmek ve kullanıcının bunları düzeltebilmesi için görünüme doğrulama hataları göndermek için genellikle bir görünüm modeli veya modeli gerekir. eShop çok platformlu uygulaması, görünüm modeli özelliklerinin zaman uyumlu istemci tarafı doğrulamasını gerçekleştirir ve geçersiz verileri içeren denetimi vurgulayarak ve kullanıcıya verilerin neden geçersiz olduğunu bildiren hata iletileri görüntüleyerek doğrulama hatalarını kullanıcıya bildirir. Aşağıdaki görüntüde, eShop çok platformlu uygulamada doğrulama gerçekleştirmeye katılan sınıflar gösterilmektedir.

eShop çok platformlu uygulamasında doğrulama sınıfları.

Doğrulama gerektiren model özelliklerini görüntüleme türündedir ValidatableObject<T>ve her ValidatableObject<T> örneğin özelliğine Validations doğrulama kuralları eklenir. Doğrulama, doğrulama kurallarını alan ve bunları özelliğine karşı yürüten örneğin yöntemini ValidatableObject<T> çağırarak Validate görünüm modelinden çağrılırValidatableObject<T>.Value. Tüm doğrulama hataları örneğin özelliğine Errors ValidatableObject<T> yerleştirilir ve IsValid örneğin özelliği ValidatableObject<T> doğrulamanın başarılı mı yoksa başarısız mı olduğunu gösterecek şekilde güncelleştirilir. Aşağıdaki kod, uygulamasını ValidatableObject<T>gösterir:

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;
    }
}

Özellik değişikliği bildirimi sınıfı tarafından ObservableObject sağlanır ve bu nedenle bir Entry denetim, girilen verilerin geçerli olup olmadığının bildirilmesi için görünüm modeli sınıfındaki örneğin özelliğine ValidatableObject<T> bağlanabilirIsValid.

Doğrulama kurallarını belirtme

Doğrulama kuralları, aşağıdaki kod örneğinde gösterilen arabirimden IValidationRule<T> türetilen bir sınıf oluşturularak belirtilir:

public interface IValidationRule<T>
{
    string ValidationMessage { get; set; }
    bool Check(T value);
}

Bu arabirim, doğrulama kuralı sınıfının gerekli doğrulamayı gerçekleştirmek için kullanılan bir boole Check yöntemi ve doğrulama başarısız olursa görüntülenecek doğrulama hata iletisi olan bir ValidationMessage özellik sağlaması gerektiğini belirtir.

Aşağıdaki kod örneği, eShop çok platformlu uygulamada sahte hizmetler kullanılırken kullanıcı tarafından girilen kullanıcı LoginView adı ve parolanın doğrulanması için kullanılan doğrulama kuralını gösterirIsNotNullOrEmptyRule<T>:

public class IsNotNullOrEmptyRule<T> : IValidationRule<T>
{
    public string ValidationMessage { get; set; }

    public bool Check(T value) =>
        value is string str && !string.IsNullOrWhiteSpace(str);
}

yöntemi, Check değer bağımsız değişkeninin null, boş veya yalnızca boşluk karakterlerinden oluştuğunu belirten bir boole döndürür.

eShop çok platformlu uygulaması tarafından kullanılmasa da, aşağıdaki kod örneğinde e-posta adreslerini doğrulamaya yönelik bir doğrulama kuralı gösterilmektedir:

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);
}

yöntemi, Check değer bağımsız değişkeninin geçerli bir e-posta adresi olup olmadığını belirten bir boole döndürür. Bu, oluşturucuda belirtilen normal ifade deseninin ilk oluşumu için değer bağımsız değişkeni aranarak Regex elde edilir. Giriş dizesinde normal ifade deseninin bulunup bulunmadığı, ile denetlenerek value Regex.IsMatchbelirlenebilir.

Not

Özellik doğrulaması bazen bağımlı özellikleri içerebilir. Bağımlı özelliklere örnek olarak, A özelliği için geçerli değerler kümesinin B özelliğinde ayarlanmış olan belirli bir değere bağımlı olması gerekir. A özelliğinin değerinin izin verilen değerlerden biri olup olmadığını denetlemek için B özelliğinin değerinin alınması gerekir. Buna ek olarak, B özelliğinin değeri değiştiğinde, A özelliğinin yeniden karşılanması gerekir.

Özelliğe doğrulama kuralları ekleme

eShop çok platformlu uygulamasında, doğrulama gerektiren model özelliklerini görüntüleme türü ValidatableObject<T>olarak bildirilir; burada T doğrulanacak verilerin türüdür. Aşağıdaki kod örneği, bu tür iki özelliğin bir örneğini gösterir:

public ValidatableObject<string> UserName { get; private set; }
public ValidatableObject<string> Password { get; private set; }

Doğrulamanın gerçekleşmesi için, aşağıdaki kod örneğinde gösterildiği gibi doğrulama kurallarının her ValidatableObject<T> örneğin Validations koleksiyonuna eklenmesi gerekir:

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." 
    });
}

Bu yöntem doğrulama kuralını her ValidatableObject<T> örneğin koleksiyonuna Validations ekler IsNotNullOrEmptyRule<T> ve doğrulama kuralının ValidationMessage özelliği için değerleri belirtir ve doğrulama başarısız olursa görüntülenecek doğrulama hata iletisini belirtir.

Doğrulama tetikleniyor

eShop çok platformlu uygulamasında kullanılan doğrulama yaklaşımı, bir özelliğin doğrulamasını el ile tetikleyebilir ve bir özellik değiştiğinde doğrulamayı otomatik olarak tetikleyebilir.

Doğrulamayı el ile tetikleme

Doğrulama, model görüntüleme özelliği için el ile tetiklenebilir. Örneğin, bu, kullanıcı sahte hizmetleri kullanırken üzerindeki düğmesine dokunduğunda Login LoginVieweShop çok platformlu uygulamasında oluşur. Komut temsilcisi, aşağıdaki kod örneğinde LoginViewModelgösterilen yöntemini yürüterek Validate doğrulamayı çağıran içindeki yöntemini çağırırMockSignInAsync:

private bool Validate()
{
    bool isValidUser = ValidateUserName();
    bool isValidPassword = ValidatePassword();
    return isValidUser && isValidPassword;
}

private bool ValidateUserName()
{
    return _userName.Validate();
}

private bool ValidatePassword()
{
    return _password.Validate();
}

yöntemi, Validate her ValidatableObject<T> örnekte yöntemini çağırarak kullanıcı tarafından üzerinde LoginViewgirilen kullanıcı adı ve parolanın Validate doğrulanması işlemini gerçekleştirir. Aşağıdaki kod örneği sınıfından Validate yöntemini ValidatableObject<T> gösterir:

public bool Validate()
{
    Errors = _validations
        ?.Where(v => !v.Check(Value))
        ?.Select(v => v.ValidationMessage)
        ?.ToArray()
        ?? Enumerable.Empty<string>();

    IsValid = !Errors.Any();

    return IsValid;
}

Bu yöntem, nesnenin Validations koleksiyonuna eklenen tüm doğrulama kurallarını alır. Alınan Check her doğrulama kuralının yöntemi yürütülür ve ValidationMessage verileri doğrulayan herhangi bir doğrulama kuralının özellik değeri örneğin koleksiyonuna Errors ValidatableObject<T> eklenir. Son olarak özelliği IsValid ayarlanır ve değeri, doğrulamanın başarılı mı yoksa başarısız mı olduğunu gösteren çağrı yöntemine döndürülür.

Özellikler değiştiğinde doğrulamayı tetikleme

İlişkili bir özellik değiştiğinde doğrulama da otomatik olarak tetikleniyor. Örneğin, içindeki iki yönlü bir bağlama LoginView veya Password özelliğini ayarlarsa UserName doğrulama tetikler. Aşağıdaki kod örneği bunun nasıl gerçekleştiğini gösterir:

<Entry Text="{Binding UserName.Value, Mode=TwoWay}">
    <Entry.Behaviors>
        <behaviors:EventToCommandBehavior
            EventName="TextChanged"
            Command="{Binding ValidateUserNameCommand}" />
    </Entry.Behaviors>
</Entry>

Denetim Entry , örneğin özelliğine UserName.Value ValidatableObject<T> bağlanır ve denetimin Behaviors koleksiyonuna bir EventToCommandBehavior örnek eklenir. Bu davranış, içindeki metin Entry değiştiğinde tetiklenen olayına Entryyanıt olarak TextChanged yürütürValidateUserNameCommand. Buna karşılık temsilciValidateUserName, ValidateUserNameCommand örnekte yöntemini yürüten yöntemini ValidatableObject<T> yürütürValidate. Bu nedenle, kullanıcı kullanıcı adı denetimine Entry her karakter girdiğinde, girilen verilerin doğrulanması gerçekleştirilir.

Doğrulama hatalarını görüntüleme

eShop çok platformlu uygulama, geçersiz verileri içeren denetimi kırmızı arka plan ile vurgulayarak ve geçersiz verileri içeren denetimin altında verilerin neden geçersiz olduğunu kullanıcıya bildiren bir hata iletisi görüntüleyerek kullanıcıya doğrulama hataları bildirir. Geçersiz veriler düzeltildiğinde arka plan varsayılan duruma geri döner ve hata iletisi kaldırılır. Doğrulama hataları olduğunda aşağıdaki görüntüde eShop çok platformlu uygulamasındaki öğesi gösterilmektedir LoginView .

Oturum açma sırasında doğrulama hatalarını görüntüleme.

Geçersiz veri içeren bir denetimi vurgulama

.NET MAUI , doğrulama bilgilerini son kullanıcılara sunmak için çeşitli yollar sunar, ancak en kolay yollardan biri kullanımıdır Triggers. Triggers bir denetim için gerçekleşen bir olaya veya veri değişikliğine bağlı olarak, genellikle görünüm için denetimlerimizin durumunu değiştirmenin bir yolunu sağlar. Doğrulama için, bağlı bir özellikten yapılan değişiklikleri dinleyen ve değişikliklere yanıt veren bir kullanacağız DataTrigger . üzerindeki Entry LoginView denetimler aşağıdaki kod kullanılarak oluşturulur:

<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>

DataTrigger aşağıdaki özellikleri belirtir:

Özellik Açıklama
TargetType Tetikleyicinin ait olduğu denetim türü.
Binding Tetikleyici koşulu için değişiklik bildirimleri ve değer sağlayacak veri Binding işaretlemesi.
Value Tetikleyicinin koşulu karşılandığında belirtilmesi gereken veri değeri.

Bunun Entryiçin özelliğindeki LoginViewModel.UserName.IsValid değişiklikleri dinleyeceğiz. Bu özellik her değişiklik yükselttiğinde, değeri içinde DataTriggerayarlanan özellikle Value karşılaştırılır. Değerler eşitse tetikleyici koşulu karşılanır ve öğesine sağlanan DataTrigger tüm Setter nesneler yürütülür. Bu denetim, özelliği işaretleme kullanılarak tanımlanan özel bir renge güncelleştiren BackgroundColor tek Setter bir nesneye StaticResource sahiptir. Bir Trigger koşul artık karşılanmadığında, denetim nesne tarafından Setter ayarlanan özellikleri önceki durumuna geri çevirir. hakkında Triggersdaha fazla bilgi için bkz . .NET MAUI Belgeleri: Tetikleyiciler.

Hata iletileri görüntüleniyor

Kullanıcı arabirimi, verileri doğrulanamayan her denetimin altındaki Etiket denetimlerinde doğrulama hata iletilerini görüntüler. Aşağıdaki kod örneğinde Label , kullanıcı geçerli bir kullanıcı adı girmediyse doğrulama hata iletisinin görüntülendiği gösterilir:

<Label
    Text="{Binding UserName.Errors, Converter={StaticResource FirstValidationErrorConverter}"
    Style="{StaticResource ValidationErrorLabelStyle}" />

Her Etiket, doğrulanan görünüm modeli nesnesinin özelliğine bağlanır Errors . Errors özelliği sınıfı tarafından ValidatableObject<T> sağlanır ve türündedirIEnumerable<string>. Errors özelliği birden çok doğrulama hatası içerebileceğinden, FirstValidationErrorConverter görüntü için koleksiyondan ilk hatayı almak için örnek kullanılır.

Özet

eShop çok platformlu uygulaması, görünüm modeli özelliklerinde zaman uyumlu istemci tarafı doğrulaması gerçekleştirir ve geçersiz verileri içeren denetimi vurgulayarak ve kullanıcıya verilerin neden geçersiz olduğunu bildiren hata iletileri görüntüleyerek doğrulama hatalarını kullanıcıya bildirir.

Doğrulama gerektiren model özelliklerini görüntüleme türündedir ValidatableObject<T>ve her ValidatableObject<T> örneğin özelliğine Validations doğrulama kuralları eklenir. Doğrulama, doğrulama kurallarını alan ve Value özelliğine karşı yürüten örneğin yöntemini ValidatableObject<T> çağırarak Validate görünüm modelinden ValidatableObject<T> çağrılır. Tüm doğrulama hataları örneğin özelliğine Errors ValidatableObject<T> yerleştirilir ve örneğin IsValid özelliği doğrulamanın ValidatableObject<T> başarılı olup olmadığını gösterecek şekilde güncelleştirilir.