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

