ASP.NET Core 校验请求契约仅传入一个参数的简便实现方法
实现三属性仅单值传入的简便校验方案
你原来的校验逻辑只判断了「全空」和「全非空」两种场景,漏掉了两两组合传参的非法情况,本质是走了枚举非法组合的思路——3个属性的传参状态一共有8种组合,其中合法状态仅3种(单传Id、单传Email、单传AccountId),剩下5种都是非法状态,靠写if分支枚举不仅繁琐,还很容易漏判。
核心思路
不需要枚举任何非法组合,只要统计参与校验的属性中被赋值(非null)的总数量,判断数量是否恰好为1即可,不管是0个、2个还是3个属性被赋值,都会被统一拦截。
具体实现
直接修改IValidatableObject的Validate方法即可:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { // 将所有互斥属性放入集合,统计非空值的数量 int specifiedParamCount = new [] { Id, Email, AccountId }.Count(p => p != null); if (specifiedParamCount != 1) { yield return new ValidationResult( "Id、Email、AccountId三个参数必须且仅允许指定其中一个", new[] { nameof(Id), nameof(Email), nameof(AccountId) }); } }
方案优势
- 无冗余多重if判断,逻辑简单不容易出错,能100%覆盖所有非法传参场景
- 后续如果新增同规则的互斥属性,只需要往数组里添加对应属性即可,维护成本极低
- 如果是int、bool等值类型属性参与校验,只需要把判空逻辑替换为
p => !Equals(p, default)即可适配
内容的提问来源于stack exchange,提问作者user17365408
相关产品推荐
相关产品推荐

