在开发移动应用程序时,表单验证是一个关键功能,它确保用户输入的数据符合预期的格式和规则。本文将介绍如何使用Xamarin Forms来实现表单验证,支持 iOS 和 Android 设备。将遵循 ASP.NET MVC 中的数据注解验证方法,以保持一致性和简洁性。
设计目标包括:
在开始之前,请确保已经安装了最新版本的 Visual Studio 2017,并安装了 Xamarin 工作负载和模拟器。
使用 Visual Studio 2017 创建一个新的 Xamarin Forms 项目。选择 "文件" -> "新建" -> "项目"。在新项目窗口中,选择 "跨平台" -> "移动应用 (Xamarin Forms)"。输入项目名称 "Validation Demo" 并点击 "确定"。选择 "空白项目" 并创建项目。
为了验证示例,将在 MainPage.xaml 中添加两个输入字段(用户名和密码)以及一个登录按钮。提交表单时,将实现以下验证逻辑:
打开 MainPage.xaml 并修改 XAML 如下:
注意:为了使验证工作,在每个输入字段下方添加了错误标签,并遵循了 "Entry Binding Field Name Error" 的命名约定。"." 被替换为 "_"。
创建 Login Model 类,其中包含验证逻辑。确保向项目中添加 System.ComponentModel.Annotations Nuget 包。
using System.ComponentModel.DataAnnotations;
namespace ValidationsDemo.Model
{
public class LoginModel
{
[Required, MaxLength(20), EmailAddress]
public string Username { get; set; }
[Required]
public string Password { get; set; }
public bool RememberMe { get; set; }
}
}
注意:在上面的模型中,使用 Required, MaxLength(20) 和 EmailAddress 属性应用了所有验证要求。
由于Xamarin Forms推荐使用MVVM模式,将创建一个名为 MainPageViewModel.cs 的视图模型类。
namespace ValidationsDemo.ViewModel
{
public class MainPageViewModel
{
public LoginModel LoginModel { get; set; } = new LoginModel();
public ICommand LoginInCommand { get; private set; }
public MainPageViewModel(Page page)
{
_page = page;
LoginInCommand = new Command(async () => await LoginAsync());
}
private async Task LoginAsync()
{
if (!ValidationHelper.IsFormValid(LoginModel, _page)) return;
await _page.DisplayAlert("Success", "Validation Success!", "OK");
}
}
}
注意:在上面的代码中,在 LoginAsync 命令中,有一个 ValidationHelper.IsFormValid(LoginModel, _page) 代码,它将根据验证属性对表单进行所有验证的魔法。将在下一节中详细了解验证帮助器类。
打开 MainPage.xaml.cs 文件,并将视图模型类实例分配给 Main Page Binding Context,如下所示:
using ValidationsDemo.ViewModel;
using Xamarin.Forms;
namespace ValidationsDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
this.BindingContext = new MainPageViewModel(this);
}
}
}
创建一个名为 ValidationHelper 的新类,并添加一个 public 方法 IsFormValid,签名如下:
public static class ValidationHelper
{
public static bool IsFormValid(object model, Page page)
{
HideValidationFields(model, page);
var errors = new List();
var context = new ValidationContext(model);
bool isValid = Validator.TryValidateObject(model, context, errors, true);
if (!isValid)
{
ShowValidationFields(errors, model, page);
}
return errors.Count() == 0;
}
private static void HideValidationFields(object model, Page page, string validationLabelSuffix = "Error")
{
if (model == null) return;
var properties = GetValidatablePropertyNames(model);
foreach (var propertyName in properties)
{
var errorControlName = $"{propertyName.Replace(".", "_")}{validationLabelSuffix}";
var control = page.FindByName
已经完成了基本的表单验证实现,现在是时候进行测试了。让通过目标可用的模拟器运行项目,应该能够看到以下登录屏幕。要执行各种测试用例,请单击登录按钮。