C#自定义模型验证主要通过DataAnnotations特性与IValidatableObject接口配合实现:前者用于字段级简单规则(如非空、长度、格式),后者处理跨字段及业务逻辑强相关的复合校验(如时间顺序、密码一致性、服务依赖验证)。

在 C# 中实现自定义模型验证,主要靠 DataAnnotations 特性 + 实现 IValidatableObject 接口两种方式配合使用。前者适合字段级简单规则(如非空、长度、格式),后者用于跨字段、业务逻辑强相关的复合校验(比如“结束时间不能早于开始时间”)。
这是最常用、最直观的方式。给模型属性打上内置特性,框架(如 ASP.NET Core MVC、Entity Framework)会自动触发验证。
[Required(ErrorMessage = "用户名不能为空")]
ValidationAttribute,重写 IsValid 方法(支持服务注入时建议用 IValidationAttributeAdapterProvider 配合)当验证逻辑涉及多个属性、需要访问外部服务或执行复杂判断时,让模型实现 IValidatableObject 接口更合适。它提供一个 Validate 方法,在所有字段级验证通过后被调用。
public IEnumerable<validationresult> Validate(ValidationContext validationContext)</validationresult>
ValidationResult.Success 表示通过;否则用 new ValidationResult("错误信息", new[] { "关联属性名" }) 返回失败项StartDate 和 EndDate 是否合法:Validate 通常不执行(取决于具体上下文,如 MVC 默认跳过)实际开发中,推荐分层验证:用 DataAnnotations 拦住明显非法输入(空值、超长、格式错),再用 IValidatableObject 处理依赖关系和业务约束。
[Required] 控制昵称、邮箱必填;[EmailAddress] 校验邮箱格式;IValidatableObject 则检查“密码与确认密码是否一致”、“邀请码是否有效”、“手机号是否已被注册”(需注入服务)Validate 中调用 DI 服务(如数据库查重),可通过 validationContext.GetService<iuserservice>()</iuserservice> 获取(ASP.NET Core 3.0+ 支持)ModelState(Web)或 Validator.TryValidateObject(手动触发)收集,无需额外适配验证不是自动发生的,得靠框架或手动调用才生效。
ModelState.IsValid 为 false
Validator.TryValidateObject(model, new ValidationContext(model), results, true)(true 表示验证所有属性,包括私有)results 可看到全部错误;也可在 Validate 方法里加断点,确认逻辑是否执行Validate 中抛异常——应返回 ValidationResult,否则可能中断流程基本上就这些。DataAnnotations 负责“能不能输”,IValidatableObject 负责“合不合理”,搭配着用,验证既清晰又灵活。
以上就是C# 如何自定义模型验证 - DataAnnotations与IValidatableObject的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号