Aracılığıyla paylaş


Enterprise Apps'te doğrulama

Not

Bu e-Kitap 2017 baharında yayımlanmıştır ve o zamandan beri güncelleştirilmemiştir. Kitapta değerli kalan çok şey var, ancak bazı malzemeler güncelliğini yitirmiş.

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ğrulama, iş kurallarını zorunlu kılar ve saldırganın kötü amaçlı veri eklemesini engeller.

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. eShopOnContainers mobil 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. Şekil 6-1'de eShopOnContainers mobil uygulamasında doğrulama gerçekleştirmeye katılan sınıflar gösterilmektedir.

Validation classes in the eShopOnContainers mobile app

Şekil 6-1: eShopOnContainers mobil 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 çağırarak Validate görünüm modelinden çağrılırValidatableObject<T>Value.ValidatableObject<T> Tüm doğrulama hataları örneğin özelliğine ErrorsValidatableObject<T> yerleştirilir ve IsValid örneğin özelliği doğrulamanın ValidatableObject<T> başarılı mı yoksa başarısız mı olduğunu gösterecek şekilde güncelleştirilir.

Özellik değişikliği bildirimi sınıfı tarafından ExtendedBindableObject 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 booleanCheck yöntem 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, eShopOnContainers mobil uygulamasında 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)  
    {  
        if (value == null)  
        {  
            return false;  
        }  

        var str = value as string;  
        return !string.IsNullOrWhiteSpace(str);  
    }  
}

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

eShopOnContainers mobil 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>  
{  
    public string ValidationMessage { get; set; }  

    public bool Check(T value)  
    {  
        if (value == null)  
        {  
            return false;  
        }  

        var str = value as string;  
        Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");  
        Match match = regex.Match(str);  

        return match.Success;  
    }  
}

yöntemi, Check değer bağımsız değişkeninin geçerli bir boolean e-posta adresi olup olmadığını belirten bir 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ığı, nesnenin Success özelliğinin Match değeri denetlenerek belirlenebilir.

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

eShopOnContainers mobil 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  
    {  
        return _userName;  
    }  
    set  
    {  
        _userName = value;  
        RaisePropertyChanged(() => UserName);  
    }  
}  

public ValidatableObject<string> Password  
{  
    get  
    {  
        return _password;  
    }  
    set  
    {  
        _password = value;  
        RaisePropertyChanged(() => Password);  
    }  
}

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 koleksiyonuna eklenmesi Validations 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ğrulamayı Tetikleme

eShopOnContainers mobil uygulamasında kullanılan doğrulama yaklaşımı, bir özelliğin doğrulamasını el ile tetikleyebilir ve ö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 LoginViewOturum Aç düğmesine dokunduğunda eShopOnContainers mobil 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 Validate yöntemini çağırarak kullanıcı tarafından üzerinde LoginViewgirilen kullanıcı adı ve parolanın 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.Clear();  

    IEnumerable<string> errors = _validations  
        .Where(v => !v.Check(Value))  
        .Select(v => v.ValidationMessage);  

    Errors = errors.ToList();  
    IsValid = !Errors.Any();  

    return this.IsValid;  
}

Bu yöntem koleksiyonu temizler ve nesnenin Errors koleksiyonuna Validations 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 ErrorsValidatableObject<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 tetiklenebilir. Ö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.ValueValidatableObject<T> bağlanır ve denetimin Behaviors koleksiyonuna bir EventToCommandBehavior örnek eklenir. Bu davranış, içindeki metin Entry değiştiğinde tetiklenen [TextChanged] olayına Entryyanıt olarak 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.

Davranışlar hakkında daha fazla bilgi için bkz . Davranış Uygulama.

Doğrulama Hatalarını Görüntüleme

eShopOnContainers mobil uygulaması, geçersiz verileri içeren denetimi kırmızı çizgiyle 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ını bildirir. Geçersiz veriler düzeltildiğinde, satır siyaha dönüşür ve hata iletisi kaldırılır. Şekil 6-2'de doğrulama hataları olduğunda eShopOnContainers mobil uygulamasında LoginView gösterilmektedir.

Displaying validation errors during login

Şekil 6-2: Oturum açma sırasında doğrulama hatalarını görüntüleme

Geçersiz Veri İçeren Bir Denetimi Vurgulama

Ekli LineColorBehavior davranış, doğrulama hatalarının oluştuğu denetimleri vurgulamak Entry için kullanılır. Aşağıdaki kod örneği, ekli davranışın LineColorBehavior bir Entry denetime nasıl eklendiğini gösterir:

<Entry Text="{Binding UserName.Value, Mode=TwoWay}">
    <Entry.Style>
        <OnPlatform x:TypeArguments="Style">
            <On Platform="iOS, Android" Value="{StaticResource EntryStyle}" />
            <On Platform="UWP" Value="{StaticResource UwpEntryStyle}" />
        </OnPlatform>
    </Entry.Style>
    ...
</Entry>

Denetim Entry , aşağıdaki kod örneğinde gösterilen açık bir stil tüketir:

<Style x:Key="EntryStyle"  
       TargetType="{x:Type Entry}">  
    ...  
    <Setter Property="behaviors:LineColorBehavior.ApplyLineColor"  
            Value="True" />  
    <Setter Property="behaviors:LineColorBehavior.LineColor"  
            Value="{StaticResource BlackColor}" />  
    ...  
</Style>

Bu stil, denetimdeki ApplyLineColor ekli davranışın LineColorBehaviorEntry ve LineColor ekli özelliklerini ayarlar. Stiller hakkında daha fazla bilgi için bkz . Stiller.

Ekli özelliğin ApplyLineColor değeri ayarlandığında veya değiştiğinde LineColorBehavior , ekli davranış aşağıdaki kod örneğinde gösterilen yöntemini yürütür OnApplyLineColorChanged :

public static class LineColorBehavior  
{  
    ...  
    private static void OnApplyLineColorChanged(  
                BindableObject bindable, object oldValue, object newValue)  
    {  
        var view = bindable as View;  
        if (view == null)  
        {  
            return;  
        }  

        bool hasLine = (bool)newValue;  
        if (hasLine)  
        {  
            view.Effects.Add(new EntryLineColorEffect());  
        }  
        else  
        {  
            var entryLineColorEffectToRemove =   
                    view.Effects.FirstOrDefault(e => e is EntryLineColorEffect);  
            if (entryLineColorEffectToRemove != null)  
            {  
                view.Effects.Remove(entryLineColorEffectToRemove);  
            }  
        }  
    }  
}

Bu yöntemin parametreleri, davranışın eklendiği denetimin örneğini ve ekli özelliğin ApplyLineColor eski ve yeni değerlerini sağlar. Ekli EntryLineColorEffect özellik trueise sınıfı denetimin Effects koleksiyonuna ApplyLineColor eklenir, aksi takdirde denetimin Effects koleksiyonundan kaldırılır. Davranışlar hakkında daha fazla bilgi için bkz . Davranış Uygulama.

alt EntryLineColorEffect sınıfını RoutingEffect sınıflandırır ve aşağıdaki kod örneğinde gösterilir:

public class EntryLineColorEffect : RoutingEffect  
{  
    public EntryLineColorEffect() : base("eShopOnContainers.EntryLineColorEffect")  
    {  
    }  
}

sınıfı, RoutingEffect platforma özgü bir iç efekti sarmalayan platformdan bağımsız bir efekti temsil eder. Bu, platforma özgü bir efektin tür bilgilerine derleme zamanı erişimi olmadığından etki kaldırma işlemini basitleştirir. temel EntryLineColorEffect sınıf oluşturucuyu çağırır ve çözüm grubu adının birleştirmesini içeren bir parametreyi ve platforma özgü her efekt sınıfında belirtilen benzersiz kimliği geçirir.

Aşağıdaki kod örneği, iOS için uygulamayı gösterir eShopOnContainers.EntryLineColorEffect :

[assembly: ResolutionGroupName("eShopOnContainers")]  
[assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")]  
namespace eShopOnContainers.iOS.Effects  
{  
    public class EntryLineColorEffect : PlatformEffect  
    {  
        UITextField control;  

        protected override void OnAttached()  
        {  
            try  
            {  
                control = Control as UITextField;  
                UpdateLineColor();  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Can't set property on attached control. Error: ", ex.Message);  
            }  
        }  

        protected override void OnDetached()  
        {  
            control = null;  
        }  

        protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)  
        {  
            base.OnElementPropertyChanged(args);  

            if (args.PropertyName == LineColorBehavior.LineColorProperty.PropertyName ||  
                args.PropertyName == "Height")  
            {  
                Initialize();  
                UpdateLineColor();  
            }  
        }  

        private void Initialize()  
        {  
            var entry = Element as Entry;  
            if (entry != null)  
            {  
                Control.Bounds = new CGRect(0, 0, entry.Width, entry.Height);  
            }  
        }  

        private void UpdateLineColor()  
        {  
            BorderLineLayer lineLayer = control.Layer.Sublayers.OfType<BorderLineLayer>()  
                                                             .FirstOrDefault();  

            if (lineLayer == null)  
            {  
                lineLayer = new BorderLineLayer();  
                lineLayer.MasksToBounds = true;  
                lineLayer.BorderWidth = 1.0f;  
                control.Layer.AddSublayer(lineLayer);  
                control.BorderStyle = UITextBorderStyle.None;  
            }  

            lineLayer.Frame = new CGRect(0f, Control.Frame.Height-1f, Control.Bounds.Width, 1f);  
            lineLayer.BorderColor = LineColorBehavior.GetLineColor(Element).ToCGColor();  
            control.TintColor = control.TextColor;  
        }  

        private class BorderLineLayer : CALayer  
        {  
        }  
    }  
}

yöntemi denetimin OnAttached yerel denetimini Xamarin.FormsEntry alır ve yöntemini çağırarak UpdateLineColor çizgi rengini güncelleştirir. Geçersiz OnElementPropertyChanged kılma, eklenen LineColor özellik değişirse çizgi rengini veya Height değişikliklerin özelliğini güncelleştirerek denetimdeki bağlanabilir özellik değişikliklerine EntryEntry yanıt verir. Efektler hakkında daha fazla bilgi için bkz . Efektler.

Denetime Entry geçerli veriler girildiğinde, doğrulama hatası olmadığını belirtmek için denetimin altına siyah bir çizgi uygular. Şekil 6-3'de bunun bir örneği gösterilmektedir.

Black line indicating no validation error

Şekil 6-3: Doğrulama hatası olmadığını gösteren siyah çizgi

Denetimin Entry koleksiyonuna Triggers bir DataTrigger de eklenir. Aşağıdaki kod örneği şunları DataTriggergösterir:

<Entry Text="{Binding UserName.Value, Mode=TwoWay}">  
    ...  
    <Entry.Triggers>  
        <DataTrigger   
            TargetType="Entry"  
            Binding="{Binding UserName.IsValid}"  
            Value="False">  
            <Setter Property="behaviors:LineColorBehavior.LineColor"   
                    Value="{StaticResource ErrorColor}" />  
        </DataTrigger>  
    </Entry.Triggers>  
</Entry>

BuDataTrigger, özelliğini izler UserName.IsValid ve değeri olursafalse, ekli davranışın SetterLineColor ekli özelliğini LineColorBehavior kırmızı olarak değiştiren öğesini yürütür. Şekil 6-4'de bunun bir örneği gösterilmektedir.

Red line indicating validation error

Şekil 6-4: Doğrulama hatasını gösteren kırmızı çizgi

Denetimdeki Entry satır, girilen veriler geçersizken kırmızı kalır, aksi takdirde girilen verilerin geçerli olduğunu belirtmek için siyah olarak değişir.

Tetikleyiciler hakkında daha fazla bilgi için bkz . Tetikleyiciler.

Hata İletilerini Görüntüleme

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ği, kullanıcı geçerli bir kullanıcı adı girmediyse doğrulama hata iletisi görüntüleyen öğesini gösterir Label :

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

Her Label biri, 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ündedirList<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

eShopOnContainers mobil 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.

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 çağırarak Validate görünüm modelinden çağrılırValidatableObject<T>Value.ValidatableObject<T> Tüm doğrulama hataları örneğin özelliğine ErrorsValidatableObject<T>yerleştirilir ve IsValid örneğin özelliği doğrulamanın ValidatableObject<T> başarılı mı yoksa başarısız mı olduğunu gösterecek şekilde güncelleştirilir.