数据验证映射


  数据验证使用的是 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 方法可以验证实体是否有效,如果验证失败,抛出 EntityInvalidateExceptionPropertyInvalidateException 类型的异常。如下所示:

[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}。")
        }
    }
}

  EmailAttributeWebSiteAttributeTelphoneAttributeMobileAttributeZipCodeAttribute 是继承自 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 类自定义验证特性来扩充你的验证库。