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

System.ComponentModel.DataAnnotations中StringLength验证始终返回true求助

System.ComponentModel.DataAnnotations中StringLength/MaxLength验证不生效的问题

问题出在Validator.TryValidateObject的调用逻辑上——默认情况下这个方法只会验证带有[Required]属性的字段,不会触发StringLength、MaxLength这类非必填类的验证规则。

要解决这个问题,你需要在调用TryValidateObject时,将第三个参数validateAllProperties设置为true,强制验证器检查所有属性的所有验证规则。

修改后的测试类代码

using System.ComponentModel.DataAnnotations;
using FluentAssertions;
using Xunit.Abstractions;

public class MyClassTests
{
    [Fact]
    public void MyFieldCantExceed50Characters()
    {
        var obj = new MyClass
        {
            MyField = "12345",
        };

        ICollection<ValidationResult> validationResults = new List<ValidationResult>();
        // 关键:添加第三个参数validateAllProperties为true
        var validated = Validator.TryValidateObject(obj, new ValidationContext(obj), validationResults, true);
        validated.Should().BeFalse(); // 现在断言会成功
    }
}

原因说明

当validateAllProperties为默认值false时,验证器的逻辑是:

  • 仅检查带有[Required]的字段是否有值
  • 不会执行其他验证规则(比如长度、格式校验)

只有将该参数设为true,验证器才会遍历目标对象的所有属性,应用所有标记的DataAnnotations验证属性,包括StringLength、MaxLength、Range等。

你的模型类无需修改,保持原代码即可:

using System.ComponentModel.DataAnnotations;

public class MyClass
{
    [Required]
    [StringLength(3)]
    //[MaxLength(3)] 使用该属性也会生效
    public string? MyField { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:54:24