在Xamarin.Forms企业应用程序中进行验证

简介: 我们在五月份发布了一本《使用Xamarin.Forms的企业应用程序模式》的电子书。电子书专注于开发Xamarin.Forms更容易测试,维护和发展的企业应用程序的核心模式和架构指导。

我们在五月份发布了一本《使用Xamarin.Forms的企业应用程序模式》的电子书。电子书专注于开发Xamarin.Forms更容易测试,维护和发展的企业应用程序的核心模式和架构指导。 提供了关于如何实现Model-View-ViewModel(MVVM)模式,依赖注入,导航,验证和配置管理的指导,同时保持松耦合。 此外,还提供了使用IdentityServer执行认证和授权,从集装式微服务访问远程数据以及单元测试的指导。

这篇博客文章探讨了Xamarin.Forms企业应用程序的验证。当然,有许多方法可以用于验证。这里介绍的是eShopOnContainers手机应用程序中的验证方法,这是可扩展的,易于单元测试,并且支持数据绑定和属性更改通知。

介绍

任何接受用户输入的应用程序都应确保输入有效。 例如,应用程序可以检查仅包含特定范围内的字符的输入,具有一定长度,或匹配特定格式。 没有验证,用户可以提供导致应用失败的数据。 验证强制执行业务规则,并防止攻击者注入恶意数据。

在Model-ViewModel-Model(MVVM)模式的上下文中,通常需要视图模型或模型来执行数据验证,并向视图发出任何验证错误,以便用户可以对其进行更正。 eShopOnContainers移动应用程序执行视图模型属性的同步客户端验证,并通过突出显示包含无效数据的控件,并通过显示通知用户为什么数据无效的错误消息来通知用户任何验证错误。 下图显示了在eShopOnContainers移动应用程序中执行验证所涉及的类:

需要验证的视图模型属性的类型为ValidatableObject ,并且每个ValidatableObject 实例将验证规则添加到其Validations属性。通过调用ValidatableObject 实例的Validate方法从视图模型调用验证,它检索验证规则并根据ValidatableObject Value属性执行它们。任何验证错误都被放置在ValidatableObject 实例的Errors属性中,并且ValidatableObject 实例的IsValid属性被更新,以指示验证是成功还是失败。

属性更改通知由ExtendedBindableObject类提供,因此Entry控件可以绑定到视图模型类中的ValidatableObject 实例的IsValid属性,以通知输入的数据是否有效。

指定验证规则

验证规则通过创建从IValidationRule 接口派生的类来指定,如下面的代码示例所示:

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

此接口指定验证规则类必须提供用于执行所需验证的布尔检查方法,以及ValidationMessage属性,其值为验证失败时将显示的验证错误消息。

以下代码示例显示了IsNotNullOrEmptyRule 验证规则,用于在eShopOnContainers移动应用配置为使用模拟服务时,在LoginView上输入的用户名和密码进行验证:

public class IsNotNullOrEmptyRule : IValidationRule
{
    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是要验证的数据的类型。 以下代码示例显示了一个此类属性的示例:

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

为了进行验证,验证规则必须添加到ValidatableObject 实例的Validations集合中,如以下代码示例所示:

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

此方法将IsNotNullOrEmptyRule 验证规则添加到ValidatableObject 实例的Validations集合中,包括ValidationMessage属性的值,该值指定验证失败时将显示的验证错误消息。

触发验证

视图模型属性可以手动触发验证。 例如,当使用模拟服务时,当用户点击LoginView上的Login按钮时,会发生在eShopOnContainers移动应用程序中。 命令委托在LoginViewModel中调用MockSignInAsync方法,该方法通过执行Validate方法来调用验证,该方法又调用ValidateUserName方法:

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

ValidateUserName方法通过调用ValidatableObject 实例上的Validate方法来执行用户在LoginView上输入的用户名验证。 以下代码示例显示了ValidatableObject 类中的Validate方法:

public bool Validate()
{
    Errors.Clear();

    IEnumerable errors = _validations
        .Where(v => !v.Check(Value))
        .Select(v => v.ValidationMessage);

    Errors = errors.ToList();
    IsValid = !Errors.Any();

    return this.IsValid;
}

此方法将清除Errors集合,然后检索添加到对象的Validations集合的任何验证规则。 执行每个检索的验证规则的检查方法,并且无法验证数据的任何验证规则的ValidationMessage属性值都将添加到ValidatableObject 实例的错误集合中。 最后,设置IsValid属性,并将其值返回给调用方法,指示验证是成功还是失败。

绑定属性更改时也会自动触发验证。 了解更多信息,请查看属性变化是的触发验证

显示验证错误

eShopOnContainers手机应用程序通过突出显示包含无效数据的控件以红色线条通知用户任何验证错误,并显示一条错误消息,通知用户为什么数据在包含无效数据的控件下无效。 以下屏幕截图显示eShopOnContainers手机应用程序中的一些LoginView,当出现验证错误时:

突出显示包含无效数据的控件

LineColorBehavior附加行为用于突出显示已发生验证错误的Entry控件。 以下代码示例显示如何将LineColorBehavior附加行为附加到Entry控件:

    
        
    
    ...

Entry控件使用显式样式,如下面的代码示例所示:



    ...
    
    
    ...

此样式将EntryColorBehavior附加行为的ApplyLineColor和LineColor附加属性设置为Entry控件。 当ApplyLineColor附加属性的值被设置或更改时,LineColorBehavior附加行为执行OnApplyLineColorChanged方法,该方法将EntryLineColorEffect类添加或删除到Entry的Effects集合。 有关EntryLineColorEffect类的更多信息,请查看突出显示包含无效数据的控件

Entry控件还将DataTrigger添加到其Triggers集合中。 以下代码示例显示DataTrigger:

    ...
    
        
            
        
    

该DataTrigger监视UserName.IsValid属性,如果值为false,它将执行Setter,它将LineColorBehavior附加行为的LineColor附加属性更改为红色。

显示错误信息

UI会在数据失败验证的每个控件下面的Label控件中显示验证错误消息。 以下代码示例显示如果用户未输入有效的用户名,则该标签显示验证错误消息:

 

每个标签绑定到正在验证的视图模型对象的Errors属性。 错误属性由ValidatableObject 类提供,类型为List 。 因为Errors属性可能包含多个验证错误,FirstValidationErrorConverter实例用于从集合中检索第一个错误以进行显示。

概要

《使用Xamarin.Forms的企业应用程序模式》专注于开发Xamarin.Forms更容易测试,维护和发展的企业应用程序的核心模式和架构指导。 电子书还附带了示例应用程序,eShopOnContainers手机应用程序其执行视图模型属性的同步客户端验证,并通过突出显示包含无效数据的控件,并通过显示通知用户为什么数据无效的错误消息来通知用户任何验证错误。

目录
相关文章
|
前端开发 .NET 测试技术
使用Xamarin.Forms开发企业应用程序
与企业应用开发人员多年合作,我们知道他们面临着几个挑战,其中包括: 随着时间的推移,需求不断变化 新的商机和挑战 在开发期间持续的反馈可能会显着影响应用程序的范围和要求 考虑到这一点,重要的是构建既灵活又可随时间轻松修改或扩展的应用程序。
1114 0
|
测试技术 Android开发 iOS开发
使用Xamarin.Forms的企业应用程序模式(电子书)--介绍
无论平台如何,企业应用开发人员都面临着几个挑战: 随时间变化的应用程序要求。 新的商机和挑战。 开发期间持续的反馈可能会显着影响应用程序的范围和要求。
1462 0
|
前端开发 测试技术
使用Xamarin.Forms的企业应用程序模式(电子书)--单元测试
移动应用程序具有独特的问题,桌面和基于Web的应用程序不必担心。移动用户将因其使用的设备,网络连接,服务可用性以及一系列其他因素而有所不同。因此,应该测试移动应用程序,因为它们将被用于现实世界,以提高其质量,可靠性和性能。
977 0
|
Web App开发 存储 缓存
使用Xamarin.Forms的企业应用程序模式(电子书)--访问远程数据
许多现代的基于Web的解决方案利用由Web服务器托管的Web服务来为远程客户端应用程序提供功能。 Web服务公开的操作构成Web API。 客户端应用程序应该能够在不知道API暴露的数据或操作如何实现的情况下使用Web API。
1301 0
|
Web App开发 存储 .NET
使用Xamarin.Forms的企业应用程序模式(电子书)--认证和授权
身份验证是从用户获取身份验证凭证(例如姓名和密码)以及根据权限验证这些凭据的过程。如果凭据有效,则提交凭据的实体被认为是认证身份。一旦身份被认证,授权过程将确定该身份是否可以访问给定的资源。
1438 0
|
存储 消息中间件 Docker
使用Xamarin.Forms的企业应用程序模式(电子书)--容器化微服务
开发客户端 - 服务器应用程序的重点是建立在每个层中使用特定技术的分层应用程序。这样的应用通常被称为单片应用,并且被封装在用于峰值负载预分配的硬件上。这种开发方法的主要缺点是每个层级组件之间的紧密耦合,各个组件不能轻易缩放,并且测试成本。
1020 0
使用Xamarin.Forms的企业应用程序模式(电子书)--验证
任何接受用户输入的应用程序都应确保输入有效。 例如,应用程序可以检查仅包含特定范围内的字符的输入,具有一定长度,或匹配特定格式。 没有验证,用户可以提供导致应用失败的数据。 验证强制执行业务规则,并防止攻击者注入恶意数据。
909 0
|
存储 API 容器
使用Xamarin.Forms的企业应用程序模式(电子书)--配置管理
设置允许将配置应用程序行为的数据与代码分离,允许在不重新构建应用程序的情况下更改行为。有两种类型的设置:应用设置和用户设置。 应用设置是应用程序创建和管理的数据。它可以包括固定Web服务端点,API密钥和运行时状态等数据。
1092 0
|
开发工具 Android开发
【Xamarin.Android】使用Azure应用服务本地验证安卓脸书
认证是应用成功的关键。看看你的应用程序,我敢打赌,你的用户首先要做的就是注册或登录到他们的帐户。反过来,这可能会利用某种形式的社会认证。每个社会身份验证提供者都有点不同,一些像脸书网这样的用户提供了一个原生SDK来简化登录过程,并为他们的服务提供额外的功能。
1084 0
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
127 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件

热门文章

最新文章