我終於找到了問題的原因。因此,當您閱讀時,請抓住您的咖啡(當然還有那些像我這樣的ASP.NET MVC模型綁定新手)。正如我所說,我有一個問題與複選框,單選按鈕和選擇元素(這不是在DropDownListFor幫助方法幫助下生成的)不具有正確的值。在發回表單時,我能夠保存所有數據(除了複選框),我已正確輸入數據庫。但是在閱讀時,表格並沒有填入正確的值 - 選擇選擇了第一個選項,單選按鈕和複選框清晰。問題的常見原因是價值屬性沒有正確的價值。所以我會一一接觸他們每一個。
- 在某些選擇元件用DropDownListFor <>輔助方法創建的視圖,而一些只是標爲普通的HTML他們的名字匹配到相應的模型屬性,就像這樣的:
<select class="select-normal" name="ApplicationType">
<option value="0">--Choose--</option>
<option value="1">Complaint</option>
<option value="2">Proposal</option>
<option value="3">Query</option>
</select>
ApplicationType是自定義枚舉類型。
public Enum ApplicationType{
Complaint=1
Proposal=2,
Query=3
}
當編輯/插入模式所選擇的選項被容易地結合到相應的屬性,因爲有從數值以枚舉隱式轉換。但是在閱讀時,模型屬性值是枚舉成員的名稱,而不是其基礎值。也就是說,如果ApplicationType是ApplicationType.Proposal,MVC引擎將查找具有相同名稱的元素並將找到我們的選擇。然後它將嘗試找到具有「建議」值的選項,而不是2,並且它不會找到任何值。因此,我們必須將值設置爲枚舉選項的名稱,就像這樣:
<select class="select-normal" name="ApplicationType">
<option value="0">--Choose--</option>
<option value="Complaint">Complaint</option>
<option value="Proposal">Proposal</option>
<option value="Query">Query</option>
</select>
但即使僅此還不足以讓選擇正確的選項。問題是,要選擇一個選項,需要設置selected
屬性,例如selected="selected"
。不幸的是,我無法弄清楚如何實現這一點,所以我搜索了網頁,發現在MVC 5.1中有一個新的Html擴展方法,其中包含EnumDropDownListFor <>,您可以從here將其添加到項目中。此方法從枚舉中生成html select元素。在使用它之前,你必須牢記兩件事:
a)如果你想讓你的選擇顯示用戶友好的名字,你需要用Disaplay(Name =「Enum1 display text」)裝飾你的枚舉選項 b)By該方法將默認將選項元素的值設置爲枚舉的基礎值。只要改變這個
string value = Convert.ChangeType(field.GetValue(null), baseEnumType).ToString();
這個
string value=field.Name;
將此代碼添加到您的項目後,喲要做的唯一事情是剛剛加入的這一行代碼
@Html.EnumDropDownListFor(x => x.ApplicationType, new { @class = "select-normal" })
但當然,如果你設法控制選項的「選擇性」,你仍然可以走舊路。那就是,你很好走。
對於單選按鈕,我的錯誤是將該值設置爲Enum.GetHashCode()。所以改變該
@ Html.RadioButtonFor(X => x.PreferredReplyMethod,PreferredReplyMethod.Verbal.GetHashCode())
此就能解決問題
@ Html.RadioButtonFor (X => x.PreferredReplyMethod, PreferredReplyMethod.Verbal .GetHashCode())
雖然有複選框,但情況有點不同。如果我通過模型到Html.BeginForm方法明確地這樣
@using(Html.Beginform( 「SaveDocument」, 「DocumentController」,型號))
和調試操作方法,我可以看到與複選框相對應的模型屬性(它們都是類型int
)的值爲「0」。所以當他們回讀時,這會導致複選框被取消選中。我一直無法弄清楚爲什麼,因爲如果我讓MVC引擎隱式通過模型,這個問題就會消失。
@using(Html.Beginform("SaveDocument","DocumentController"))