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

如何在C#中验证可空属性的范围?

问题原因及解决方案

默认情况下,ASP.NET Core的RangeAttribute对可空值类型(如long?)的验证逻辑是:仅当属性值不为null时,才会检查值是否在指定范围内。如果属性值为null,ModelState不会触发范围验证错误。

针对不同需求的解决办法

1. 要求属性必须有值且在范围内

如果OfferId不允许为null,只需同时添加[Required]特性,这样null值会被Required拦截,非null值则会执行范围验证:

[Required]
[Range(0, 9223372036854775807L)]
public long? OfferId { get; set; }

2. 允许null,但非null值必须符合范围

这种场景下默认的RangeAttribute已经生效——当传入非null的非法值(比如-1、超过9223372036854775807L的数)时,ModelState会触发验证错误。如果测试时传入的是null,自然不会有范围验证提示,这是符合预期的。

3. 自定义可空类型的范围验证(可选)

如果需要更灵活的验证逻辑,比如强制对非null值做严格范围检查,可自定义验证属性:

public class NullableRangeAttribute : RangeAttribute
{
    public NullableRangeAttribute(long minimum, long maximum) : base(minimum, maximum) { }

    public override bool IsValid(object value)
    {
        // 值为null时视为有效,非null时调用基类验证范围
        return value == null || base.IsValid(value);
    }
}

使用时替换原Range特性即可:

[NullableRange(0, 9223372036854775807L)]
public long? OfferId { get; set; }

注意事项

确保在控制器方法中主动检查ModelState.IsValid,触发验证逻辑:

[HttpPost]
public IActionResult Submit(YourModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    // 执行业务逻辑
    return Ok();
}

内容的提问来源于stack exchange,提问作者Shameel Perayil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:54:36