2012-05-08 18 views
3

我正在使用ASP.Net MVC 2並且無法使DropDownList正確綁定。MVC 2 DropDownList沒有選擇列表中的值

我使用強類型的ViewModel和HTML.DropDownListFor語句在我的視圖中創建下拉菜單。該聲明在'正常'場景中正常工作,我只是將DropDown綁定到ViewModel中的簡單字段。 當我的ViewModel包含多個對象的列表(數組)時,我想在這些對象的每個對象中綁定到一個(單獨的)DropDown時使用此方案。在這種情況下,DropDown沒有得到正確的初始值。

例如,我們有一個人可以有多個地址的情況。每個地址由街道,城市和州組成。我希望狀態顯示爲DropDown。 我的模式是:

public class PersonModel : CommonViewModel 
{ 
    public IList<SelectListItem> AvailableStates { get; set; } 

    public string Name { get; set; } 

    public IList<AddressModel> Addresses { get; set; } 

    public PersonModel() 
    { 
     AvailableStates = GenerateStates(); 
    } 

    private IList<SelectListItem> GenerateStates() 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 
     items.Add(new SelectListItem() { Text = "WA", Value = "WA" }); 
     items.Add(new SelectListItem() { Text = "NY", Value = "NY" }); 
     items.Add(new SelectListItem() { Text = "IH", Value = "IH" }); 
     items.Add(new SelectListItem() { Text = "FL", Value = "FL" }); 
     items.Add(new SelectListItem() { Text = "CA", Value = "CA" }); 

     return items; 
    } 
} 

public class AddressModel 
{ 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

現在在我看來,我想使用類似:

<% using (Html.BeginForm("SubmitPersonDetails", "Home", new { actionMode = "Person"}, FormMethod.Post, new { id = "SubmitPersonForm" })) 
    {%> 
    <div class="formrow longinput"> 
    <%= Html.LabelFor(person => person.Name)%> 
    <%= Html.TextBoxFor(person => person.Name)%> 
</div> 
<h4>Addresses</h4> 
<% for (int i = 0; i < Model.Addresses.Count; i++) { %> 
<div class="formrow"> 
<%= Html.TextBoxFor(person => person.Addresses[i].Street)%> 
<%= Html.TextBoxFor(person => person.Addresses[i].City)%> 
<%--<%= Html.TextBoxFor(person => person.Addresses[i].State)%>--%> 
<%= Html.DropDownListFor(person => person.Addresses[i].State, Model.AvailableStates) %> 
</div> 
<% } %> 
<input class="button primary" type="submit" value="Submit" name="Submit" /> 
<% } %> 

對於文本框能正常工作(也如果我只是使用狀態的文本框,看到評論out位)。 DropDown是正確生成的,但未設置爲正確的值。如果我在DropDowns中選擇一個值並提交表單,則將正確的值放回到我的模型中。

我也嘗試把地址部分放在一個UserControl中,然後再渲染幾次。如果我使用Html.RenderPartial呈現UserControl,則在DropDOwn中設置正確的值,但在Postback中,我的模型未正確填充。如果使用EditorFor呈現UserControl,我得到的問題與上面的代碼一樣:DropDown沒有得到正確的初始值,但在Postback上,我得到了在我的模型中設置的選定值。

另一件事我想是使地址不是一個名單,但在我看來模型(屬性:地址1,地址,地址3),而不是硬編碼幾個IP地址,然後使用: <%= Html.DropDownListFor(人=>人。 Address1.State,Model.AvailableStates)%> 在這種情況下,DropDown會得到正確的值。顯然,我不想使用這種解決方法缺乏靈活性。

我在做什麼錯?我是MVC的新手,所以也許這是我的整個做法是錯誤的?

回答

8

這是DropDownListFor幫助程序的限制,它無法從複雜的lambda表達式(如正在使用的表達式(包含數組索引訪問的lambda表達式))中提取值。一個可能的解決方法如下:

<%= Html.DropDownListFor(
    person => person.Addresses[i].State, 
    new SelectList(
     Model.AvailableStates, 
     "Text", 
     "Value", 
     Model.Addresses[i].State 
    ) 
) %> 

這是一個有點難看,因爲我們現在通過相同的值在選擇列表的構造函數,但這次DropDownListFor助手將能夠正確地設置相應的選項。

+2

謝謝,這似乎工作正常。正如你所說:也許不像我所希望的那樣優雅,但絕對可以接受。 –

+3

請注意,'dataValueField'參數是第二個,'dataTextField'參數是第三個,因此您可能需要切換「文本」和「值」。 –

+0

這是哪裏記錄它不能從一個「複雜」lambda中提取「選定」的值? – Triynko