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

ご覧のとおり、文字列が null の場合StringLengthは true を返します。

于 2013-04-25T10:06:45.557 に答える
2

StringLength属性は文字列の長さのみを検証するためです。文字列が null でない場合にのみ検証を行います。

からの検証方法は次の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 に答える