2013-05-28 102 views
14

我已通讀此問題ASP.NET MVC DropDownListFor not selecting value from model並回答但我不知道解決方案是否存在問題。MVC DropDownListFor未從模型中選擇值

這是我的看法:

@foreach (var adjusterLanguages in Model.adjusterLanguages) 
{ 
    <div class="editor-field row"> 
     @Html.DropDownListFor(model => Model.adjusterLanguages[i].languageID, 
           (SelectList)ViewBag.ForeignLanguages) 
     @Html.ValidationMessageFor(model =>Model.adjusterLanguages[i].languageID) 
    </div> 

    <div style="clear: left;"></div> 

    i++; 
} 

我可以證實,該模型數據被填充(從我的控制器):

model.adjusterLanguages = adjLangs; 

所以,我怎樣才能讓它在選擇項目時,模型被髮送到視圖?

生成的HTML如下:

<div class="editor-field row"> 
    <select id="adjusterLanguages_0__languageID" name="adjusterLanguages[0].languageID"><option value="">--Select-- 
     </option> 
     <option value="94c5be88-814e-4719-9784-587eb88aa975">Afrikanns</option> 
     <option value="37b7bf71-7f4e-47c2-8b81-652b0d63dbcb">Albanian</option> 
     <option value="c94d6d85-0ba2-47d7-932e-2a61feba37b3">Arabic</option> 
     <!-- ... truncated for brevity ... --> 
    </select> 
    <span class="field-validation-valid" data-valmsg-for="adjusterLanguages[0].languageID" data-valmsg-replace="true"></span> 
</div> 
<div style="clear: left;"></div> 
<div class="editor-field row"> 
    <select id="adjusterLanguages_1__languageID" name="adjusterLanguages[1].languageID"> 
      <option value="">--Select--</option> 
      <option value="94c5be88-814e-4719-9784-587eb88aa975">Afrikanns</option> 
      <option value="37b7bf71-7f4e-47c2-8b81-652b0d63dbcb">Albanian</option> 
      <option value="c94d6d85-0ba2-47d7-932e-2a61feba37b3">Arabic</option> 
      <!-- ... truncated for brevity ... --> 
    </select> 
    <span class="field-validation-valid" data-valmsg-for="adjusterLanguages[1].languageID" data-valmsg-replace="true"></span> 
</div> 
+0

是從上面的代碼產生什麼HTML? –

+0

@MattHouser好問題;請參閱我的編輯。 – user1477388

+0

您的任何'

回答

29

我找到了答案!感謝大家的幫助。當我將我的代碼更改爲以下代碼時,它可以工作。該代碼只是指定選定的值:

@Html.DropDownListFor(
    model => Model.adjusterLanguages[i].languageID, 
    new SelectList(
     ViewBag.ForeignLanguages, "Value", "Text", 
     @Model.adjusterLanguages[i].languageID)) 
+0

我喜歡這個解決方案。 –

+0

@MattHouser謝謝! – user1477388

+0

感謝您的解決方案。我不明白爲什麼它不會選擇正確的值,也許它不應該?奇怪... – Luke

1

在我的ViewBag.ForeignLanguages的意見一個項目應該有Selected屬性設置爲true。 DropDownListFor方法根據ModelState選擇項目。 Here你有DropDownListFor方法的源代碼的存在是一樣的東西:

object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string)); 

如果該值是null,則選擇值從Selected財產

4

當你在控制器中填充ViewBag.ForeignLanguages檢索,上應該選擇的項目,請將.Selected屬性設置爲true。

但是,您將遇到問題,因爲您有許多項目使用相同的ForeignLangauges項目列表。

您需要爲列表中的每個adjusterLanguages創建一個列表。它們不能共享同一個列表,因爲adjusterLanguages[0]需要比adjusterLanaguages[1]

編輯選擇了另一項目:

我喜歡這種模式:

public class AdjusterLanguageModel 
{ 
    public Guid LanguageId { get; set; } 
    List<SelectListItem> ForeignLanguages{ get; set; } 
} 

public class AdjusterListModel 
{ 
    public List<AdjusterLanguageModel> AdjusterLanguages { get; set } 
} 

在控制器中,您填充列表與ID它是自己的可用語言列表。

在你看來:

@foreach (var adjusterLanguages in Model.AdjusterLanguages) 
{ 
    <div class="editor-field row"> 
     @Html.DropDownListFor(model => adjusterLanguages[i].LanguageID, 
      adjusterLanguages[i].ForeignLanguages) 
     @Html.ValidationMessageFor(model => adjusterLanguages[i].LanguageID) 
    </div> 

    <div style="clear: left;"></div> 

    i++; 
} 

所以每個DropDownListFor得到的它自己的語言列表。

+0

但是,選定的項目值已經在模型中。不應該MVC簡單地從列表中選擇項目?是否有重寫使它可以這樣做? – user1477388

+0

它應該,但它不是。重寫是讓你在控制器中設置'.Selected'屬性爲true。 –

+0

謝謝,馬特。請看我剛剛找到的答案。這是確定默認選定值的覆蓋。 http://stackoverflow.com/a/16799915/1477388 – user1477388

1

我知道這是一個古老的問題,但以防萬一有人面臨着與我相同的問題。在我的情況是,我不小心在模型中使用普通變量而不是屬性,只要我將它設置爲屬性而不是它開始工作。

+0

我知道的更好!但這正是發生的事情。這是一種單向模式(沒有傳統的回發),我碰巧修改了一個選擇列表。感謝您的提醒! –

0

我添加了一個擴展方法來執行值的選擇。它還保留頁面重新加載時的視圖狀態數據。

public static class SelectListExtensions 
{ 
    public static SelectList SelectValue(this SelectList selectList, object value) 
    { 
     return new SelectList(selectList, "Value", "Text", value); 
    } 
} 

用法爲:

selectList = selectList.SelectValue(someValue); 
0

我在SLIST而不是ViewBag

發送的IEnumerable
@Html.DropDownListFor(model => Model.list[i].Id, new SelectList(Model.SList, "Value", "Text", Model.list[i].Id), htmlAttributes: new { @class = "form-control" }) 
相關問題