2015-06-04 55 views
0

這是一個兩部分問題。首先,我明白,如果使用這種在我的模型:視圖中的表單域如何與模型中的對象關聯?

[Required(ErrorMessageResourceType = typeof(Resources.CustomerSatisfactionSurvey), ErrorMessageResourceName = "Page1Question1Required")] 
    public int? LikelyToReturn { get; set; } 

然後這在我看來:

@for (var c = 0; c < 11; c++) 
    { 
     @Html.RadioButtonFor(model => Model.LikelyToReturn, @c) 
    } 

那我現在已經在模型中「LikelyToReturn」創建對象之間的關聯和視圖中的同名單選按鈕組。當用戶選擇一個單選按鈕並點擊提交按鈕時,模型將被更新,並且LikelyToReturn被選中的值填充。沒有我必須專門消除這兩者,這發生。

問題1:這是如何工作的?我認爲它與[Required ...]標籤有關,但我想確定。

問題2:如何創建與該字段的這種關聯不是必需的?我有其他模型變量&表單字段具有匹配的名稱,但不是必需的,並且它們不會自動關聯。

謝謝!

回答

2

這與您的[Required]屬性無關。提交表單時,會根據表單控件的name屬性(input,selecttextarea元素)將一系列名稱/值對發送回您的控制器方法。

在你的情況下,你有一個單選按鈕組(你生成11個控件<input type="radio" name="LikelyToReturn" ... />)的值爲0-10。如果你選擇第3個單選按鈕並提交,發佈的表單數據將是LikelyToReturn: 2

在控制器端,DefaultModelBinder負責讀取表單數據(以及其他值,如路徑數據)並將發佈的值與模型屬性進行匹配。如果您的模型包含名爲LikelyToReturn的屬性,則其值將設置爲2

[Required]屬性是驗證屬性,用於驗證您的屬性。在你的情況,如果您手動包括一個額外的單選按鈕

<input type="radio" name="LikelyToReturn" value="" /> 

,並選擇它,然後驗證將失敗,因爲它會設置LikelyToReturn=null;,如果您有其他性質的錯誤將被添加到ModelState

你的模型沒有被綁定,那很可能是因爲(1)控件的name屬性與你的屬性名稱不匹配,這就是爲什麼你總是應該使用強類型html助手來生成表單中的html,或(2)你試圖綁定到字段而不是屬性(即沒有0​​)

相關問題