项目已经具备了增、删、改、查功能,但是在新建和修改页面中并没有对特定字段进行验证,例如必填字段、数值必须在指定范围内、字符串满足特定要求等类似规则。ASP.NET Core的System.ComponentModel.DataAnnotations 命名空间中提供了一组属性特性,用于设置对象类中属性的验证方式,详细的特性清单请参照参考文献5,本文中仅对常用的属性特性进行说明,并应用在项目中。
所有属性验证特性都继承自ValidationAttribute类,该类中的属性ErrorMessage用于指定验证失败时的错误提示信息,如果不设置的话则使用默认的提示信息,如下面列表中的RequiredAttribute所示。
- RequiredAttribute:设置属性为必填字段,如果没有设置提示消息的话,则如下图所示,而设置了错误提示消息的截图如下。测试过程中,该错误提示是在点了提交按钮后才出现的;
[Display(Name = "名称")]
[StringLength(60, MinimumLength = 3)]
[Required(ErrorMessage="名称不能为空")]
public string Title { get; set; }
- RangeAttribute:可以设置数值、日期等数据字段的取值范围。测试过程中,值发生变化后,如果不满足验证条件,则会立即显示错误信息;
[Range(0, 1, ErrorMessage = "好评率的值只能在0与1之间")]
[Display(Name = "好评率")]
public string Rating { get; set; }
[Display(Name = "发布时间")]
[DataType(DataType.Date)]
[Range(typeof(DateTime), "1/1/1900", "1/1/2021",
ErrorMessage = "发布之间必须在1900年至2021年之间")]
public DateTime ReleaseDate { get; set; }
-
RegularExpressionAttribute:属性的值必须符合设置的正则表达式;
-
EmailAddressAttribute:属性的值必须是邮件地址。用属性字段进行测试,如下图所示,只有输入的内容包含@,并且其后有内容是才不会出现错误提示。错误提示是在输入内容过程中出现的;
-
StringLengthAttribute:设置字符串的长度范围。测试过程中输入的内容达到了最大长度后,就无法在输入更多的内容;
[StringLength(10, ErrorMessage = "输入的内容长度必须在3到10之间", MinimumLength = 3)]
[Display(Name = "类型")]
public string Genre { get; set; }
上述属性只是本项目中用来测试的属性,System.ComponentModel.DataAnnotations命名空间中包含有几十种验证特性,可以根据程序需要进行配置。
在新建页面和编辑页面的cshtml页面文件中,为了显示属性的错误提示,为每个属性都配置了相应的span标签,同时应用验证消息标记帮助程序(asp-validation-for)指定要验证的属性名称。具体的代码如下所示。关于验证消息标记帮助程序的详细介绍请见参考文献2.
通过设置属性的验证特性,同时在页面中使用验证消息标记帮助程序管理字段要验证的属性,可以在编辑过程中自动验证字段内容并显示错误提示信息,但是用户体验一般,例如有字数限制的字段没有提示还能输入多少字、所有的错误消息都同时显示(之前翻译的文章中讨论过)等等。估计还是才入门的原因,还没有接触到提高用户体验的功能或设置,后续还会继续根据微软的教程(参考文献1)深入学习ASP.NET Core。
参考文献:
[1]https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/validation?view=aspnetcore-5.0&tabs=visual-studio-code
[2]https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-5.0#the-validation-tag-helpers
[3]https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-6
[4]https://docs.microsoft.com/zh-cn/dotnet/api/system.componentmodel.dataannotations?view=net-5.0