2013-04-25 52 views
4

我已經在我的ViewModelStringLength /驗證MINLENGTH不會阻止用戶沒有價值張貼的形式

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

以下屬性如果字符串最終被超過20個字符驗證會火,不允許用戶發佈表單。但是,如果該字段爲空,這意味着LeagueName屬性的長度小於1,它將允許用戶發佈表單。

我知道這很容易通過使用Required屬性來解決,但爲什麼驗證在這種情況下無法按預期工作?

+0

這是設計。如果你想要一個字段,除了沒有輸入,或者如果有輸入,那麼在3到6個字符之間呢? – devdigital 2013-04-25 10:04:08

+0

是什麼讓你認爲這是預期的行爲? – 2013-04-25 10:05:51

回答

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

正如你可以看到,當字符串爲空StringLength返回true。

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