4

我的 ViewModel 上有以下属性

[StringLength(20, MinimumLength = 1, ErrorMessageResourceName = "Error_StringLength", ErrorMessageResourceType = typeof(Global))]
public string LeagueName { get; set; }

如果字符串最终大于 20 个字符,则验证将触发并且不允许用户发布表单。但是,如果该字段为空白,这意味着 LeagueName 属性的长度小于 1,它将允许用户发布表单。

我知道这很容易通过使用 Required 属性来解决,但是为什么在这种情况下验证没有按预期工作?

4

3 回答 3

4

这是设计使然。

这是 StringLength 的验证逻辑:

public override bool IsValid(object value)
{
  this.EnsureLegalLengths();
  int num = value == null ? 0 : ((string) value).Length;
  if (value == null)
    return true;
  if (num >= this.MinimumLength)
    return num <= this.MaximumLength;
  else
    return false;
}

如您所见,当字符串为 nullStringLength时返回 true。

于 2013-04-25T10:06:45.557 回答
2

因为该StringLength属性只验证字符串长度。它仅在字符串不为空时进行验证。

这是来自的验证方法System.ComponentModel.DataAnnotations.dll

public override bool IsValid(object value)
    {
      this.EnsureLegalLengths();
      int num = value == null ? 0 : ((string) value).Length;
      if (value == null)
        return true;
      if (num >= this.MinimumLength)
        return num <= this.MaximumLength;
      else
        return false;
    }
于 2013-04-25T10:03:59.917 回答
0

使用最新版本的 MVC(5.1 和 jquery 验证包)并改用MinLength属性。有关详细信息,请参阅此内容mvc51-release-notes#Unobtrusive

于 2014-06-26T03:44:54.820 回答