Doğrulama
İpucu
Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak bulunan .NET MAUIKullanan Kurumsal Uygulama Desenleri adlı e-Kitap'tan bir alıntıdır.
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.
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
LoginView
eShop çok platformlu 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 yöntemini çağırarak kullanıcı tarafından üzerinde LoginView
girilen 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 Entry
yanı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
.
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 Entry
için özelliğindeki LoginViewModel.UserName.IsValid
değişiklikleri dinleyeceğiz. Bu özellik her değişiklik yükselttiğinde, değeri içinde DataTrigger
ayarlanan ö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 Triggers
daha 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.