如何在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
相关产品推荐
相关产品推荐

