数据验证映射
数据验证使用的是 System.ComponentModel.DataAnnotations
模型,并且在此基础上扩展的一些验证特性,如下:
MaxLengthAttribute 验证字符串的最大长度。
RangeAttribute 验证数值的最小值及最大值范围。
StringLengthAttribute 验证字符串的最小及最大长度范围。
RequiredAttribute 验证必填。
RegularExpressionAttribute 验证正则表达式。
EmailAttribute 验证邮件格式。
WebSiteAttribute 验证网址格式。
TelphoneAttribute 验证电话号码。
MobileAttribute 验证手机号码。
TelphoneOrMobileAttribute 验证电话号码或手机号码。
IDCardAttribute 验证身份证号。
EnumRangeAttribute 验证枚举值范围。
GreaterThanAttribute 验证值的范围必须大于某个数。
ZipCodeAttribute 验证邮政编码格式。
你可以将特性加到实体类的属性上,也可以使用 MetadataTypeAttribute
特性指定单独的一个类来标记数据验证特性,但要注意两个类中的属性名称要一一对应。如下所示:
[EntityMapping("products")]
[MetadataType(typeof(ProductsMetadata))]
public class Products : LightEntity<Products>
{
[PropertyMapping(ColumnName = "product_id", IsPrimaryKey = true, GenerateType = IdentityGenerateType.AutoIncrement, IsNullable = false)]
public virtual int Id { get; set; }
[PropertyMapping(ColumnName = "product_name", Length = 40, IsNullable = false)]
public virtual string ProductName { get; set; }
}
public class ProductsMetadata
{
[Required]
public object Id { get; set; }
[Required]
[StringLength(40)]
public object ProductName { get; set; }
}
[EntityMapping("orders")]
public class Orders : LightEntity<Orders>
{
[PropertyMapping(ColumnName = "order_id", IsPrimaryKey = true, GenerateType = IdentityGenerateType.AutoIncrement, IsNullable = false)]
[Required]
public virtual int Id { get; set; }
[PropertyMapping(ColumnName = "customer_id", Length = 40, IsNullable = false)]
[Required]
[StringLength(40)]
public virtual string CustomerId { get; set; }
}
使用 ValidationUnity
类的 GetValidations 方法可以获取实体类或属性相关的所有验证特性。如下所示:
[TestMethod]
public void TestGetValidations()
{
var entityValidations = ValidationUnity.GetValidations(typeof(Products));
var property = PropertyUnity.GetProperty(typeof(Products), nameof(Products.ProductName));
var propertyValidations = ValidationUnity.GetValidations(property);
}
使用 ValidationUnity
类的 Validate 方法可以验证实体是否有效,如果验证失败,抛出 EntityInvalidateException
或 PropertyInvalidateException
类型的异常。如下所示:
[TestMethod]
public void TestValidate()
{
var entity = new Products();
try
{
ValidationUnity.Validate(entity);
}
catch (EntityInvalidateException exp)
{
foreach (var err in exp.PropertyErrors)
{
var message = string.Join(";", err.Value.Select(s => s.ErrorMessage));
Console.WriteLine($"属性 {err.Key.Name} 验证失败,详细信息为:{message}。")
}
}
}
EmailAttribute
、WebSiteAttribute
、TelphoneAttribute
、MobileAttribute
和 ZipCodeAttribute
是继承自 ConfigurableRegularExpressionAttribute
类的,表示它们的正则表达式是可以配置。你可以在应用目录下创建 validation-regulars.xml 或 validation-regulars.json 文件,来修改它们的验证规则,比如手机号,增加号码段后,你是需要定期维护的。如下所示:
- validation-regulars.xml 文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<config>
<patterns>
<pattern key="Email">^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$</pattern>
<pattern key="Mobile">^13[0-9]{9}|15[012356789][0-9]{8}|18[0-9][0-9]{8}|14[5678][0-9]{8}|17[0235678][0-9]{8}|166[0-9]{8}|19[89][0-9]{8}$</pattern>
</patterns>
</config>
- validation-regulars.json 文件如下:
{
"Email": "^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$",
"Mobile": "^13[0-9]{9}|15[012356789][0-9]{8}|18[0-9][0-9]{8}|14[5678][0-9]{8}|17[0235678][0-9]{8}|166[0-9]{8}|19[89][0-9]{8}$"
}
💡 小提示
你可以继承 ValidationAttribute
类自定义验证特性来扩充你的验证库。