溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

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

這篇博客文章探討了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)證所涉及的類:

在Xamarin.Forms企業(yè)應(yīng)用程序中進(jìn)行驗(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ī)則

驗(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ù)是空值,空值還是僅由空格字符組成。

向?qū)傩蕴砑域?yàn)證規(guī)則

在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ò)誤消息。

觸發(fā)驗(yàn)證

視圖模型屬性可以手動(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)證。

顯示驗(yàn)證錯(cuò)誤

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í):

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

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

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附加屬性更改為紅色。

顯示錯(cuò)誤信息

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ò)誤。

向AI問一下細(xì)節(jié)

免責(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)容。

AI