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

.NET中是否存在针对固定值集合的ValidationAttribute?

.NET中固定值集合的验证实现

.NET框架本身没有直接提供你示例中[StringOptions]、[IntOptions]这类特定类型的固定值验证特性,但可以通过以下两种方式轻松实现需求:

一、自定义通用ValidationAttribute

你可以创建一个通用的验证特性,支持任意类型的固定值校验,代码如下:

public class AllowedValuesAttribute : ValidationAttribute
{
    private readonly HashSet<object> _allowedValues;

    public AllowedValuesAttribute(params object[] allowedValues)
    {
        _allowedValues = new HashSet<object>(allowedValues);
        ErrorMessage = $"值必须是以下选项之一: {string.Join(", ", _allowedValues)}";
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // 处理值为null且null在允许列表中的情况
        if (value == null && _allowedValues.Contains(null))
        {
            return ValidationResult.Success;
        }

        // 检查值是否在允许集合内
        if (value != null && _allowedValues.Contains(value))
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(ErrorMessage);
    }
}

使用示例

在你的模型中直接应用该特性即可,注意修正示例中IntType的类型错误(应该为int而非string):

public record RequestModel
{
    [AllowedValues("a", "b", "c")]
    public string StringType { get; init; }

    [AllowedValues(1, 10, 100)]
    public int IntType { get; init; }
}

如果需要针对特定类型做更严格的校验(比如防止类型不匹配),可以在特性中增加类型检查逻辑,比如只允许字符串或整数类型的属性使用。

二、利用枚举(Enum)限制取值

如果你的固定值集合适合定义为枚举类型,这种方式更简洁,且无需额外验证逻辑:

// 定义字符串对应的枚举
public enum StringTypeEnum { a, b, c }
// 定义整数对应的枚举
public enum IntTypeEnum { One = 1, Ten = 10, Hundred = 100 }

public record RequestModel
{
    public StringTypeEnum StringType { get; init; }
    public IntTypeEnum IntType { get; init; }
}

这种方式下,模型绑定和验证会自动限制取值只能是枚举中定义的选项,缺点是无法支持动态变化的固定值集合。

在ASP.NET Core等场景中,控制器接收模型时,ModelState.IsValid会自动触发上述验证逻辑,若值不符合要求则会返回对应的错误信息。

内容的提问来源于stack exchange,提问作者Roi Shabtai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:57:51