Validator忽略MaxLength属性

时间:2017-12-01 00:36:24

标签: c#

问题: 我试图手动验证一些c#对象,而Validator忽略了与字符串长度相关的验证。

测试用例 使用[Required]属性扩展this example,我还想验证字符串不是太长,如下所示。

public class Recipe
{
    //[Required]
    public string Name { get; set; }

    [MaxLength(1)] public string difficulty = "a_string_that_is_too_long";
}

public static void Main(string[] args)
{

    var recipe = new Recipe();
    var context = new ValidationContext(recipe, serviceProvider: null, items: null);
    var results = new List<ValidationResult>();

    var isValid = Validator.TryValidateObject(recipe, context, results);

    if (!isValid)
    {
        foreach (var validationResult in results)
        {
            Console.WriteLine(validationResult.ErrorMessage);
        } 
    } else {
        Console.WriteLine("is valid");
    }
}

预期结果:错误:“难度太长。”

实际结果:'有效'

其他测试事项:

  • 验证器正在工作,取消注释消息“名称字段是必需的”中的[必需]结果。
  • 使用[StringLength]代替(如上所述) 在https://stackoverflow.com/a/6802739/432976)没有任何区别。

1 个答案:

答案 0 :(得分:5)

您需要进行2次更改才能使验证按预期方式工作:

<强> 1。您必须将difficulty字段更改为属性。

Validator类仅验证属性,因此将difficulty定义更改为如下属性:

[MaxLength(1)] public string difficulty { get; set; } = "a_string_that_is_too_long";

<强> 2。指定validateAllProperties: true来电的Validator.TryValidateObject参数。

Validator.TryValidateObject的{​​{3}}并非即将发布,除非您使用validateAllProperties: true重载,否则只会检查Required属性。所以修改这样的调用:

var isValid = Validator.TryValidateObject(recipe,
                                          context,
                                          results,
                                          validateAllProperties: true);