2012-01-19 52 views
2

讓我們有一個模型ASP.NET MVC - int類型的模型驗證和DateTime

 public class Model 
    { 
     public int Number { get; set; } 
     public DateTime Date { get; set; } 
    } 

我觀察到以下行爲。當沒有提交任何內容時,Number屬性的值爲0,Date的值爲1.1 0001 00:00:00,ModelState.IsValid的值爲true。

的DataAnnotationsModelValidatorProvider類和GetValidators方法的代碼

 // Add an implied [Required] attribute for any non-nullable value type, 
     // unless they've configured us not to do that. 
     if (AddImplicitRequiredAttributeForValueTypes && 
       metadata.IsRequired && 
       !attributes.Any(a => a is RequiredAttribute)) { 
      attributes = attributes.Concat(new[] { new RequiredAttribute() }); 
     } 

這pieco如果我沒有理解這一權利,則數字屬性和日期時間屬性應該得到設置RequiredAttribute標籤和驗證程序應該設置模式無效,併產生相應的 錯誤消息。

所以我的問題是爲什麼模型無效?

我使用ASP.NET MVC 3

回答

5

所以我的問題是,爲什麼ins't模型無效?

由於0是完全有效的整數和1.1 0001 00:00:00是完全有效的日期時間。我不明白你爲什麼期望你的模型無效。

讓時間可空,並與所需的裝飾屬性來達到預期的效果:

public class Model 
{ 
    [Required] 
    public int? Number { get; set; } 

    [Required] 
    public DateTime? Date { get; set; } 
} 
+0

的模式應該是無效becauce沒有價值從形式發送。這些值不是來自輸入。所以所需的規則被打破了。對於所需的值使用可爲空的類型在我看來是錯誤的。首先,一個不可爲空的int應該像沒有任何必需的屬性那樣運行。並且可爲空的int應該表現得像一個非必需值 – user49126

+0

@ user49126,您不能在非空類型(如int或DateTime)中存儲* no值*。無論您嘗試多麼努力,CLR都不會允許您。它的工作方式是默認模型聯編程序實例化模型(當然,它的所有屬性都被分配給它們的默認值,在你的情況下,值類型將是它們各自的默認值),然後調用驗證。由於這兩個屬性在它們內部具有完全有效的值,所以不存在驗證錯誤並且它非常有意義。 –

+0

我知道,但至少模型應該是無效的。 – user49126