我们在五月份发布了一本《使用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手机应用程序 ,其执行视图模型属性的同步客户端验证,并通过突出显示包含无效数据的控件,并通过显示通知用户为什么数据无效的错误消息来通知用户任何验证错误。