Asp.Net Core中实现两个Float属性的不等值自定义注解验证
实现跨属性的自定义相等性验证
要实现这个需求很简单,因为ASP.NET内置的数据注解没法直接处理跨属性的相等性校验,所以我们需要自定义一个验证属性来搞定。下面是具体的实现步骤:
1. 创建自定义验证属性类
首先,我们要写一个继承自ValidationAttribute的自定义类,它能接收另一个属性的名称作为参数,然后在验证时对比两个属性的值:
using System.ComponentModel.DataAnnotations; using System.Reflection; public class NotEqualAttribute : ValidationAttribute { private readonly string _comparisonPropertyName; // 构造函数:传入要对比的属性名称 public NotEqualAttribute(string comparisonPropertyName) { _comparisonPropertyName = comparisonPropertyName; // 默认错误消息(可根据需求修改语言) ErrorMessage = "{0} 不能与 {1} 的值相等"; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // 获取当前待验证属性的值 var currentValue = value as float?; // 通过反射获取要对比的属性 var comparisonProperty = validationContext.ObjectType.GetProperty(_comparisonPropertyName); if (comparisonProperty == null) { return new ValidationResult($"未找到名为 {_comparisonPropertyName} 的属性"); } // 获取对比属性的值 var comparisonValue = comparisonProperty.GetValue(validationContext.ObjectInstance) as float?; // 校验逻辑:如果两个值都不为空且相等,返回验证失败 if (currentValue.HasValue && comparisonValue.HasValue && currentValue.Value.Equals(comparisonValue.Value)) { return new ValidationResult( string.Format(ErrorMessage, validationContext.DisplayName, _comparisonPropertyName) ); } // 验证通过 return ValidationResult.Success; } }
2. 在模型中应用自定义注解
接下来,只需要在你的Geometria类中,给ToleranciaSuperior属性添加这个自定义注解,并指定要对比的属性是ToleranciaInferior即可:
public class Geometria { public int Id { get; set; } public string Componente { get; set; } [Range(0, float.MaxValue)] public float ToleranciaInferior { get; set; } [Range(0, float.MaxValue)] // 应用自定义验证,指定对比属性 [NotEqual(nameof(ToleranciaInferior), ErrorMessage = "ToleranciaSuperior 不能与 ToleranciaInferior 的值相等")] public float ToleranciaSuperior { get; set; } }
额外说明
- 如果你需要处理浮点数的精度问题(比如避免因为微小误差导致误判),可以把直接的
Equals比较改成判断两个值的差值是否小于一个极小的阈值,比如:if (currentValue.HasValue && comparisonValue.HasValue && Math.Abs(currentValue.Value - comparisonValue.Value) < 0.0001f) - 这个自定义属性是通用的,你可以在其他模型的属性上重复使用,只需要传入不同的对比属性名称即可。
内容的提问来源于stack exchange,提问作者Jackal
相关产品推荐
相关产品推荐

