您好,登錄后才能下訂單哦!
這篇博客文章探討了Xamarin.Forms企業(yè)應(yīng)用程序的驗(yàn)證。當(dāng)然,有許多方法可以用于驗(yàn)證。這里介紹的是eShopOnContainers手機(jī)應(yīng)用程序中的驗(yàn)證方法,這是可擴(kuò)展的,易于單元測試,并且支持?jǐn)?shù)據(jù)綁定和屬性更改通知。
任何接受用戶輸入的應(yīng)用程序都應(yīng)確保輸入有效。 例如,應(yīng)用程序可以檢查僅包含特定范圍內(nèi)的字符的輸入,具有一定長度,或匹配特定格式。 沒有驗(yàn)證,用戶可以提供導(dǎo)致應(yīng)用失敗的數(shù)據(jù)。 驗(yàn)證強(qiáng)制執(zhí)行業(yè)務(wù)規(guī)則,并防止***者注入惡意數(shù)據(jù)。
在Model-ViewModel-Model(MVVM)模式的上下文中,通常需要視圖模型或模型來執(zhí)行數(shù)據(jù)驗(yàn)證,并向視圖發(fā)出任何驗(yàn)證錯(cuò)誤,以便用戶可以對其進(jìn)行更正。 eShopOnContainers移動(dòng)應(yīng)用程序執(zhí)行視圖模型屬性的同步客戶端驗(yàn)證,并通過突出顯示包含無效數(shù)據(jù)的控件,并通過顯示通知用戶為什么數(shù)據(jù)無效的錯(cuò)誤消息來通知用戶任何驗(yàn)證錯(cuò)誤。 下圖顯示了在eShopOnContainers移動(dòng)應(yīng)用程序中執(zhí)行驗(yàn)證所涉及的類:
需要驗(yàn)證的視圖模型屬性的類型為ValidatableObject <T>,并且每個(gè)ValidatableObject <T>實(shí)例將驗(yàn)證規(guī)則添加到其Validations屬性。通過調(diào)用ValidatableObject <T>實(shí)例的Validate方法從視圖模型調(diào)用驗(yàn)證,它檢索驗(yàn)證規(guī)則并根據(jù)ValidatableObject <T> Value屬性執(zhí)行它們。任何驗(yàn)證錯(cuò)誤都被放置在ValidatableObject <T>實(shí)例的Errors屬性中,并且ValidatableObject <T>實(shí)例的IsValid屬性被更新,以指示驗(yàn)證是成功還是失敗。
屬性更改通知由ExtendedBindableObject類提供,因此Entry控件可以綁定到視圖模型類中的ValidatableObject <T>實(shí)例的IsValid屬性,以通知輸入的數(shù)據(jù)是否有效。
驗(yàn)證規(guī)則通過創(chuàng)建從IValidationRule <T>接口派生的類來指定,如下面的代碼示例所示:
public interface IValidationRule<T> { string ValidationMessage { get; set; } bool Check(T value); }
此接口指定驗(yàn)證規(guī)則類必須提供用于執(zhí)行所需驗(yàn)證的布爾檢查方法,以及ValidationMessage屬性,其值為驗(yàn)證失敗時(shí)將顯示的驗(yàn)證錯(cuò)誤消息。
以下代碼示例顯示了IsNotNullOrEmptyRule <T>驗(yàn)證規(guī)則,用于在eShopOnContainers移動(dòng)應(yīng)用配置為使用模擬服務(wù)時(shí),在LoginView上輸入的用戶名和密碼進(jìn)行驗(yàn)證:
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); } }
Check方法返回一個(gè)布爾值,指示value參數(shù)是空值,空值還是僅由空格字符組成。
在eShopOnContainers手機(jī)應(yīng)用程序中,需要驗(yàn)證的視圖模型屬性被聲明為ValidatableObject <T>類型,其中T是要驗(yàn)證的數(shù)據(jù)的類型。 以下代碼示例顯示了一個(gè)此類屬性的示例:
public ValidatableObject<string> UserName { get { return _userName; } set { _userName = value; RaisePropertyChanged(() => UserName); } }
為了進(jìn)行驗(yàn)證,驗(yàn)證規(guī)則必須添加到ValidatableObject <T>實(shí)例的Validations集合中,如以下代碼示例所示:
private void AddValidations() { _userName.Validations.Add(new IsNotNullOrEmptyRule<string> { ValidationMessage = "A username is required." }); }
此方法將IsNotNullOrEmptyRule <T>驗(yàn)證規(guī)則添加到ValidatableObject <T>實(shí)例的Validations集合中,包括ValidationMessage屬性的值,該值指定驗(yàn)證失敗時(shí)將顯示的驗(yàn)證錯(cuò)誤消息。
視圖模型屬性可以手動(dòng)觸發(fā)驗(yàn)證。 例如,當(dāng)使用模擬服務(wù)時(shí),當(dāng)用戶點(diǎn)擊LoginView上的Login按鈕時(shí),會(huì)發(fā)生在eShopOnContainers移動(dòng)應(yīng)用程序中。 命令委托在LoginViewModel中調(diào)用MockSignInAsync方法,該方法通過執(zhí)行Validate方法來調(diào)用驗(yàn)證,該方法又調(diào)用ValidateUserName方法:
private bool ValidateUserName() { return _userName.Validate(); }
ValidateUserName方法通過調(diào)用ValidatableObject <T>實(shí)例上的Validate方法來執(zhí)行用戶在LoginView上輸入的用戶名驗(yàn)證。 以下代碼示例顯示了ValidatableObject <T>類中的Validate方法:
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; }
此方法將清除Errors集合,然后檢索添加到對象的Validations集合的任何驗(yàn)證規(guī)則。 執(zhí)行每個(gè)檢索的驗(yàn)證規(guī)則的檢查方法,并且無法驗(yàn)證數(shù)據(jù)的任何驗(yàn)證規(guī)則的ValidationMessage屬性值都將添加到ValidatableObject <T>實(shí)例的錯(cuò)誤集合中。 最后,設(shè)置IsValid屬性,并將其值返回給調(diào)用方法,指示驗(yàn)證是成功還是失敗。
綁定屬性更改時(shí)也會(huì)自動(dòng)觸發(fā)驗(yàn)證。 了解更多信息,請查看屬性變化是的觸發(fā)驗(yàn)證。
eShopOnContainers手機(jī)應(yīng)用程序通過突出顯示包含無效數(shù)據(jù)的控件以紅色線條通知用戶任何驗(yàn)證錯(cuò)誤,并顯示一條錯(cuò)誤消息,通知用戶為什么數(shù)據(jù)在包含無效數(shù)據(jù)的控件下無效。 以下屏幕截圖顯示eShopOnContainers手機(jī)應(yīng)用程序中的一些LoginView,當(dāng)出現(xiàn)驗(yàn)證錯(cuò)誤時(shí):
LineColorBehavior附加行為用于突出顯示已發(fā)生驗(yàn)證錯(cuò)誤的Entry控件。 以下代碼示例顯示如何將LineColorBehavior附加行為附加到Entry控件:
<Entry Text="{Binding UserName.Value, Mode=TwoWay}"> <Entry.Style> <OnPlatform x:TypeArguments="Style" iOS="{StaticResource EntryStyle}" Android="{StaticResource EntryStyle}" WinPhone="{StaticResource UwpEntryStyle}"/> </Entry.Style> ... </Entry>
Entry控件使用顯式樣式,如下面的代碼示例所示:
<Style x:Key="EntryStyle" TargetType="{x:Type Entry}"> ... <Setter Property="behaviors:LineColorBehavior.ApplyLineColor" Value="True" /> <Setter Property="behaviors:LineColorBehavior.LineColor" Value="{StaticResource BlackColor}" /> ... </Style>
此樣式將EntryColorBehavior附加行為的ApplyLineColor和LineColor附加屬性設(shè)置為Entry控件。 當(dāng)ApplyLineColor附加屬性的值被設(shè)置或更改時(shí),LineColorBehavior附加行為執(zhí)行OnApplyLineColorChanged方法,該方法將EntryLineColorEffect類添加或刪除到Entry的Effects集合。 有關(guān)EntryLineColorEffect類的更多信息,請查看突出顯示包含無效數(shù)據(jù)的控件。
Entry控件還將DataTrigger添加到其Triggers集合中。 以下代碼示例顯示DataTrigger:
<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>
該DataTrigger監(jiān)視UserName.IsValid屬性,如果值為false,它將執(zhí)行Setter,它將LineColorBehavior附加行為的LineColor附加屬性更改為紅色。
UI會(huì)在數(shù)據(jù)失敗驗(yàn)證的每個(gè)控件下面的Label控件中顯示驗(yàn)證錯(cuò)誤消息。 以下代碼示例顯示如果用戶未輸入有效的用戶名,則該標(biāo)簽顯示驗(yàn)證錯(cuò)誤消息:
<Label Text="{Binding UserName.Errors, Converter={StaticResource FirstValidationErrorConverter}" Style="{StaticResource ValidationErrorLabelStyle}" />
每個(gè)標(biāo)簽綁定到正在驗(yàn)證的視圖模型對象的Errors屬性。 錯(cuò)誤屬性由ValidatableObject <T>類提供,類型為List <string>。 因?yàn)镋rrors屬性可能包含多個(gè)驗(yàn)證錯(cuò)誤,F(xiàn)irstValidationErrorConverter實(shí)例用于從集合中檢索第一個(gè)錯(cuò)誤以進(jìn)行顯示。
使用Xamarin.Forms的企業(yè)應(yīng)用程序模式專注于開發(fā)Xamarin.Forms更容易測試,維護(hù)和發(fā)展的企業(yè)應(yīng)用程序的核心模式和架構(gòu)指導(dǎo)。 電子書還附帶了示例應(yīng)用程序,eShopOnContainers手機(jī)應(yīng)用程序 ,其執(zhí)行視圖模型屬性的同步客戶端驗(yàn)證,并通過突出顯示包含無效數(shù)據(jù)的控件,并通過顯示通知用戶為什么數(shù)據(jù)無效的錯(cuò)誤消息來通知用戶任何驗(yàn)證錯(cuò)誤。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。