【问题标题】:Validator.TryValidateObject Not Validating RangeAttributeValidator.TryValidateObject 不验证 RangeAttribute
【发布时间】:2011-07-19 03:03:55
【问题描述】:

给定以下对象,

public class Question
{
    [Required]
    public string QuestionText { get; set; }

    [Range(1, 5)]
    public int Difficulty { get; set; }        
}

使用以下验证码

ICollection<ValidationResult> results = new List<ValidationResult>();
Question question = new Question();
ValidationContext ctx = new ValidationContext(question, null, null);
Validator.TryValidateObject(question, ctx, results);
// results.Length = 1

为什么 Range 属性在Required 时不会产生验证错误(值显然是0)?

【问题讨论】:

    标签: asp.net-mvc data-annotations


    【解决方案1】:

    Validator.TryValidatorObject(instance, validationContext, validationResults)validateAllProperties = false 调用Validator.TryValidateObject(instance, validationContext, validationResults, validateAllProperties)

    当 validateAllProperties 为 false 时,只会验证 RequiredAttribute

    【讨论】:

    • 天哪,这是什么乱七八糟的事情。希望微软明白有个词叫做“用户友好”。
    • 这根本不直观。 :(
    【解决方案2】:

    啊,看来我需要指定 validateAllProperties = true

    Validator.TryValidateObject(question, ctx, results, true);
    

    顺便说一句,让我失望的是我有一个抽象基类,其中包含另一个属性,如果没有 validateAllProperties,Validator 也会在所有超类的第一个错误时停止。所以你会得到每个超类的验证错误(在我的例子中是 2)

    【讨论】:

    • 原帖已经有将近 3 年的历史了,我预计会有一些变化。
    • 原来我的问题略有不同 - stackoverflow.com/questions/21111905/…
    • 6 年后仍然对我有用 - 行为并没有发生太大变化,默认为 false 仍然让我感到惊讶。
    • 天哪。我不敢相信true 不是这个的默认值。多么令人头疼。谢谢
    • 我觉得这对于 API 选择与拥有一个名为 ShouldExecuteCode 的方法一样合适。谢谢,我错过了。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多