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