通过继承ValidationAttribute并重写IsValid方法可创建自定义模型验证器,如CustomEmailAttribute用于验证邮箱格式;将特性应用于模型属性即可实现灵活数据校验;支持结合IValidatableObject进行跨字段验证,或在控制器中处理异步验证逻辑,提升API输入的合法性与代码复用性。

在 ASP.net Core 中创建自定义模型验证器,主要是通过继承 ValidationAttribute 类并重写其 IsValid 方法来实现。这种方式可以让你对模型属性进行灵活的数据验证,比如检查字符串格式、数值范围或自定义业务规则。
创建自定义验证特性类
首先定义一个类,继承 ValidationAttribute,并重写 IsValid 方法:
public class CustomEmailAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null || string.IsNullOrEmpty(value.ToString())) { return new ValidationResult("邮箱不能为空。"); } var email = value.ToString(); if (!email.Contains("@") || !email.Contains(".")) { return new ValidationResult("邮箱格式不正确。"); } return ValidationResult.Success; } }
在模型中使用自定义验证器
将自定义特性应用到需要验证的模型属性上:
public class UserRegistrationModel { [Required(ErrorMessage = "用户名是必填项")] public string UserName { get; set; } [CustomEmail] public string Email { get; set; } [Range(18, 100, ErrorMessage = "年龄必须在18到100之间")] public int Age { get; set; } }
支持异步验证(可选进阶)
如果需要执行异步验证(如数据库查重),可以结合 IAsyncEnumerable 或自定义实现 IClientModelValidator 和异步逻辑,但注意默认的 ValidationAttribute 不直接支持异步。更推荐的方式是使用 ActionFilter 或在控制器中手动调用异步检查。
也可以实现 IValidatableObject 接口,在模型内部添加跨字段验证逻辑:
public class UserRegistrationModel : IValidatableObject { public string Email { get; set; } public string ConfirmEmail { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Email != ConfirmEmail) { yield return new ValidationResult("两次输入的邮箱不一致。", new[] { nameof(ConfirmEmail) }); } } }
基本上就这些。自定义模型验证器让数据校验更清晰且可复用,配合内置特性一起使用,能有效保障 API 输入的合法性。