在Xamarin.Forms企業(yè)應(yīng)用程序中進行驗證-創(chuàng)新互聯(lián)

我們在五月份發(fā)布了一本使用Xamarin.Forms的企業(yè)應(yīng)用程序模式的電子書。電子書專注于開發(fā)Xamarin.Forms更容易測試,維護和發(fā)展的企業(yè)應(yīng)用程序的核心模式和架構(gòu)指導。 提供了關(guān)于如何實現(xiàn)Model-View-ViewModel(MVVM)模式,依賴注入,導航,驗證和配置管理的指導,同時保持松耦合。 此外,還提供了使用IdentityServer執(zhí)行認證和授權(quán),從集裝式微服務(wù)訪問遠程數(shù)據(jù)以及單元測試的指導。

這篇博客文章探討了Xamarin.Forms企業(yè)應(yīng)用程序的驗證。當然,有許多方法可以用于驗證。這里介紹的是eShopOnContainers手機應(yīng)用程序中的驗證方法,這是可擴展的,易于單元測試,并且支持數(shù)據(jù)綁定和屬性更改通知。

創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元井陘做網(wǎng)站,已為上家服務(wù),為井陘各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

介紹

任何接受用戶輸入的應(yīng)用程序都應(yīng)確保輸入有效。 例如,應(yīng)用程序可以檢查僅包含特定范圍內(nèi)的字符的輸入,具有一定長度,或匹配特定格式。 沒有驗證,用戶可以提供導致應(yīng)用失敗的數(shù)據(jù)。 驗證強制執(zhí)行業(yè)務(wù)規(guī)則,并防止***者注入惡意數(shù)據(jù)。

在Model-ViewModel-Model(MVVM)模式的上下文中,通常需要視圖模型或模型來執(zhí)行數(shù)據(jù)驗證,并向視圖發(fā)出任何驗證錯誤,以便用戶可以對其進行更正。 eShopOnContainers移動應(yīng)用程序執(zhí)行視圖模型屬性的同步客戶端驗證,并通過突出顯示包含無效數(shù)據(jù)的控件,并通過顯示通知用戶為什么數(shù)據(jù)無效的錯誤消息來通知用戶任何驗證錯誤。 下圖顯示了在eShopOnContainers移動應(yīng)用程序中執(zhí)行驗證所涉及的類:

在Xamarin.Forms企業(yè)應(yīng)用程序中進行驗證

需要驗證的視圖模型屬性的類型為ValidatableObject <T>,并且每個ValidatableObject <T>實例將驗證規(guī)則添加到其Validations屬性。通過調(diào)用ValidatableObject <T>實例的Validate方法從視圖模型調(diào)用驗證,它檢索驗證規(guī)則并根據(jù)ValidatableObject <T> Value屬性執(zhí)行它們。任何驗證錯誤都被放置在ValidatableObject <T>實例的Errors屬性中,并且ValidatableObject <T>實例的IsValid屬性被更新,以指示驗證是成功還是失敗。

屬性更改通知由ExtendedBindableObject類提供,因此Entry控件可以綁定到視圖模型類中的ValidatableObject <T>實例的IsValid屬性,以通知輸入的數(shù)據(jù)是否有效。

指定驗證規(guī)則

驗證規(guī)則通過創(chuàng)建從IValidationRule <T>接口派生的類來指定,如下面的代碼示例所示:

public interface IValidationRule<T>
{
    string ValidationMessage { get; set; }
    bool Check(T value);
}

此接口指定驗證規(guī)則類必須提供用于執(zhí)行所需驗證的布爾檢查方法,以及ValidationMessage屬性,其值為驗證失敗時將顯示的驗證錯誤消息。

以下代碼示例顯示了IsNotNullOrEmptyRule <T>驗證規(guī)則,用于在eShopOnContainers移動應(yīng)用配置為使用模擬服務(wù)時,在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參數(shù)是空值,空值還是僅由空格字符組成。

向?qū)傩蕴砑域炞C規(guī)則

在eShopOnContainers手機應(yīng)用程序中,需要驗證的視圖模型屬性被聲明為ValidatableObject <T>類型,其中T是要驗證的數(shù)據(jù)的類型。 以下代碼示例顯示了一個此類屬性的示例:

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

為了進行驗證,驗證規(guī)則必須添加到ValidatableObject <T>實例的Validations集合中,如以下代碼示例所示:

private void AddValidations()
{
    _userName.Validations.Add(new IsNotNullOrEmptyRule<string> 
    { 
        ValidationMessage = "A username is required." 
    });
}

此方法將IsNotNullOrEmptyRule <T>驗證規(guī)則添加到ValidatableObject <T>實例的Validations集合中,包括ValidationMessage屬性的值,該值指定驗證失敗時將顯示的驗證錯誤消息。

觸發(fā)驗證

視圖模型屬性可以手動觸發(fā)驗證。 例如,當使用模擬服務(wù)時,當用戶點擊LoginView上的Login按鈕時,會發(fā)生在eShopOnContainers移動應(yīng)用程序中。 命令委托在LoginViewModel中調(diào)用MockSignInAsync方法,該方法通過執(zhí)行Validate方法來調(diào)用驗證,該方法又調(diào)用ValidateUserName方法:

private bool ValidateUserName()
{
    return _userName.Validate();
}

ValidateUserName方法通過調(diào)用ValidatableObject <T>實例上的Validate方法來執(zhí)行用戶在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集合的任何驗證規(guī)則。 執(zhí)行每個檢索的驗證規(guī)則的檢查方法,并且無法驗證數(shù)據(jù)的任何驗證規(guī)則的ValidationMessage屬性值都將添加到ValidatableObject <T>實例的錯誤集合中。 最后,設(shè)置IsValid屬性,并將其值返回給調(diào)用方法,指示驗證是成功還是失敗。

綁定屬性更改時也會自動觸發(fā)驗證。 了解更多信息,請查看屬性變化是的觸發(fā)驗證。

顯示驗證錯誤

eShopOnContainers手機應(yīng)用程序通過突出顯示包含無效數(shù)據(jù)的控件以紅色線條通知用戶任何驗證錯誤,并顯示一條錯誤消息,通知用戶為什么數(shù)據(jù)在包含無效數(shù)據(jù)的控件下無效。 以下屏幕截圖顯示eShopOnContainers手機應(yīng)用程序中的一些LoginView,當出現(xiàn)驗證錯誤時:

在Xamarin.Forms企業(yè)應(yīng)用程序中進行驗證

突出顯示包含無效數(shù)據(jù)的控件

LineColorBehavior附加行為用于突出顯示已發(fā)生驗證錯誤的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控件。 當ApplyLineColor附加屬性的值被設(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會在數(shù)據(jù)失敗驗證的每個控件下面的Label控件中顯示驗證錯誤消息。 以下代碼示例顯示如果用戶未輸入有效的用戶名,則該標簽顯示驗證錯誤消息:

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

每個標簽綁定到正在驗證的視圖模型對象的Errors屬性。 錯誤屬性由ValidatableObject <T>類提供,類型為List <string>。 因為Errors屬性可能包含多個驗證錯誤,F(xiàn)irstValidationErrorConverter實例用于從集合中檢索第一個錯誤以進行顯示。

概要

使用Xamarin.Forms的企業(yè)應(yīng)用程序模式專注于開發(fā)Xamarin.Forms更容易測試,維護和發(fā)展的企業(yè)應(yīng)用程序的核心模式和架構(gòu)指導。 電子書還附帶了示例應(yīng)用程序,eShopOnContainers手機應(yīng)用程序 ,其執(zhí)行視圖模型屬性的同步客戶端驗證,并通過突出顯示包含無效數(shù)據(jù)的控件,并通過顯示通知用戶為什么數(shù)據(jù)無效的錯誤消息來通知用戶任何驗證錯誤。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當前名稱:在Xamarin.Forms企業(yè)應(yīng)用程序中進行驗證-創(chuàng)新互聯(lián)
URL地址:http://bm7419.com/article34/cdesse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、移動網(wǎng)站建設(shè)、動態(tài)網(wǎng)站關(guān)鍵詞優(yōu)化、營銷型網(wǎng)站建設(shè)定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營