You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:31:02