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.
Ş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 Errors
ValidatableObject<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 boolean
Check
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 LoginView
Oturum Aç düğmesine dokunduğunda eShopOnContainers mobil uygulamasında oluşur. Komut temsilcisi, aşağıdaki kod örneğinde LoginViewModel
gö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 LoginView
girilen 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 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 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.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 [TextChanged
] olayına Entry
yanı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.
Ş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 LineColorBehavior
Entry
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 true
ise 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 Entry
Entry
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.
Ş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ı DataTrigger
gö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 Setter
LineColor
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.
Ş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 Errors
ValidatableObject<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.