【问题标题】:StringLength/Minlength validation doesn't prevent user from posting the form with no valueStringLength/Minlength 验证不会阻止用户发布没有价值的表单
【发布时间】:2013-04-25 10:00:33
【问题描述】:

我的 ViewModel 上有以下属性

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

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

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

【问题讨论】:

  • 这是设计使然。如果您想要一个字段,除了没有输入或如果有输入则 3 到 6 个字符之间?
  • 是什么让您认为这是预期的行为?

标签: asp.net-mvc validation web


【解决方案1】:

这是设计使然。

这是 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;
}

如你所见,当字符串为空时StringLength返回true。

【讨论】:

    【解决方案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;
        }
    

    【讨论】:

      【解决方案3】:

      使用最新版本的 MVC(5.1 和 jquery 验证包)并改用 MinLength 属性。详情见此mvc51-release-notes#Unobtrusive

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 2016-10-30
        • 2016-10-27
        • 1970-01-01
        • 2016-11-13
        • 2021-05-24
        • 1970-01-01
        相关资源
        最近更新 更多