2014-06-28 91 views
0

我有不同種類的元素 - 文本框,選擇,複選框和單選按鈕在我的視圖上。當我將這個強類型視圖與模型一起呈現時,有些元素會使用相應的模型值填充,但有些類型不適用。單選按鈕,複選框爲空。當選擇元素時,如果使用幫助器方法創建它們,則它們會得到正確的值,但是如果它們只是純粹的Html選擇並且其名稱對應於模型屬性,則會選擇默認優先項目。我創建了兩個複選框和單選按鈕與@Html輔助方法:Radiobutton,複選框和選擇元素不會相應填充

   @Html.RadioButtonFor(x => x.PreferredReplyMethod, PreferredReplyMethod.Written.GetHashCode(), new { id = "rbReplyWritten" }) 
      <label for="rbReplyWritten">Written</label> 
      @Html.RadioButtonFor(x => x.PreferredReplyMethod, PreferredReplyMethod.Verbal.GetHashCode(), new { id = "rbReplyVerbal" }) 
      <label for="rbReplyVerbal">Verbal</label> 

     @Html.CheckBoxFor(x => x.IsUnderControl, new { id = "chkUnderControl" }) 
     @Html.LabelFor(x => x.IsUnderControl, new { @for = "chkUnderControl" }) 

的事情是,如果我發佈這些值回服務器,所有保存的值是否正確。我該怎麼辦?

回答

2

我終於找到了問題的原因。因此,當您閱讀時,請抓住您的咖啡(當然還有那些像我這樣的ASP.NET MVC模型綁定新手)。正如我所說,我有一個問題與複選框,單選按鈕和選擇元素(這不是在DropDownListFor幫助方法幫助下生成的)不具有正確的值。在發回表單時,我能夠保存所有數據(除了複選框),我已正確輸入數據庫。但是在閱讀時,表格並沒有填入正確的值 - 選擇選擇了第一個選項,單選按鈕和複選框清晰。問題的常見原因是價值屬性沒有正確的價值。所以我會一一接觸他們每一個。

  1. 在某些選擇元件用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" }) 

但當然,如果你設法控制選項的「選擇性」,你仍然可以走舊路。那就是,你很好走。

  1. 對於單選按鈕,我的錯誤是將該值設置爲Enum.GetHashCode()。所以改變該

    @ Html.RadioButtonFor(X => x.PreferredReplyMethod,PreferredReplyMethod.Verbal.GetHashCode())

此就能解決問題

@ Html.RadioButtonFor (X => x.PreferredReplyMethod, PreferredReplyMethod.Verbal .GetHashCode()

  1. 雖然有複選框,但情況有點不同。如果我通過模型到Html.BeginForm方法明確地這樣

    @using(Html.Beginform( 「SaveDocument」, 「DocumentController」,型號))

和調試操作方法,我可以看到與複選框相對應的模型屬性(它們都是類型int)的值爲「0」。所以當他們回讀時,這會導致複選框被取消選中。我一直無法弄清楚爲什麼,因爲如果我讓MVC引擎隱式通過模型,這個問題就會消失。

@using(Html.Beginform("SaveDocument","DocumentController"))