2012-05-03 122 views
0

我有以下視圖模型(爲方便閱讀只是顯示一些屬性)避免驗證

public class Contract{ 

public string Name {get; set;} 

public ContractTerm PrpTerm { get; set; } 

} 

的PRP期限模型是這樣的

public class PrpTerm{ 

public int Id {get; set;} 
public string Name {get; set;} 

} 

對於我的模型驗證我使用XML文件注入註釋。我已經根據需要設置了Name屬性,並且我讓ContractTerm未指定任何驗證(它是列表中的可選字段)。我的觀點是有一個名稱的文本框和合同條款的選擇列表。

當我試圖保存時,我得到ModelState.IsValid屬性爲false,說PRPTerm.Id值是必需的。我知道這是因爲我們不能將一個空值賦給一個int。

有人知道避免這種情況的方法嗎?

我試過使用綁定(排除註釋,但這從數據提交中刪除字段,這不允許我得到用戶選擇的值(如果發生的話)。我不能設置爲可空的PrpClass。另一種選擇是設置PrpTerm標識的視圖模型,但我需要證明有正當理由認爲變化。

任何想法?

回答

9

隱式[Required]屬性應用於Id,因爲它是一個int是,根據定義,不爲空的(相對於int?其可爲空)。

這種行爲使用

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes

其默認值爲true是MVC配置。

您可以通過在你的Global.asax.cs

但是其設置爲false禁用此行爲,如AFinkelstein指出,這聽起來像真正的問題是您的視圖模型。我建議你重新考慮一下,而不是關閉MVC的這個方便的默認值。

我建議

public class Contract 
{ 
    public string Name { get; set; } 
    public int? PrpTermId { get; set; } 
} 

可能是你真正想要的。根據一個「有效理由」來做到這一點 - 通常認爲你的ViewModel經常會與你的模型有所不同,因爲給定的ViewModel的目的可能會與它組成的模型略有不同。

1

這聽起來並不像PrpTerm類是適當的因爲你沒有使用它的屬性,所有你真正想要的是一個PrpTermName從下拉列表中選擇,我會有一個類結構像

public class Contract 
{ 
    public string Name { get; set; } 
    public string PrpTermName { get; set; } 
    public SelectList ContractTermList { get; set; } 
} 

現在您不必擔心ID的驗證,因爲它不屬於您的視圖模型的一部分。

+0

其實,我從視圖中得到的是從列表中選擇的ID。我明白,在視圖模型上使用該術語的名稱或ID將是最佳選擇,但我找不到與「驗證不起作用」不同的參數:( – pollirrata

+0

)不包括它的論點是一個視圖模型應該只包含你需要的屬性和子視圖模型,在這種情況下,你試圖使用一個下拉列表來綁定一個多個屬性類,這個下拉列表在設計上只允許指定一個屬性。您需要的下拉列表ID對應的ViewModel最有意義,您可以在發佈後使​​用此屬性獲取控制器中的PrpTerm類(或等效的域類)。 – DMulligan