2010-05-21 60 views
4

我有一個小表格,用戶必須填寫並由以下字段組成。Asp.Net MVC句柄下拉框不是模型的一部分

名稱(文本) 值(文本) 組(A組 - 從數據庫表拉選項的列表)

現在爲這個視圖的模型看起來像這樣,

public string Name { get; set; } 
public string Value { get; set; } 
public int GroupID { get; set; } 

現在該視圖被強制輸入到上述模型中。

用什麼方法來填充下拉列表?由於數據不包含在模型中(它可以包含在模型中),我們是否應該使用Temp/View數據?一個HTML助手?什麼是實現這一目標的理想方式。

回答

2

注意:這裏假定您使用的是MVC2。

如果我需要一個強類型下拉列表(在這種情況下是一個國家列表),我在ViewModel上使用了2個屬性。

public IEnumerable<SelectListItem> Countries { get; set; } 
    public int CountryID { get; set; } 

我用類似這樣的代碼做我的行動我的列表的預轉化成IEnumerable<SelectListItem>。 (這假設一個國家班級有一個名字和唯一的ID)。

 viewModel.Countries = Repository.ListAll().Select(c => new SelectListItem { Text = c.Name, Value = c.ID }); 

然後在我的強類型來看,我使用:

<%= Html.DropDownListFor(model => model.CountryID, Model.Countries) %> 

這是偉大的,因爲當你回發到一個強類型的動作(接收相同的視圖模型回),該CountryID會所選國家的ID。

另一個好處,如果他們有問題與驗證。您只需重新填充.Countries列表,將視圖模型傳回到視圖中,並自動選擇正確的值。

+0

pitts - 這會失敗,並出現以下錯誤。 「具有'OptionGroupID'鍵的ViewData項是'System.Int32'類型,但必須是'IEnumerable '類型。使用以下語法,<%= Html。DropDownListFor(model => model.OptionGroupID,Model.OptionGroups)%> – LiamB 2010-05-24 11:12:59

+0

@Pino,這真的很奇怪。讓我明天檢查我的代碼並回復你。 – 2010-05-24 12:04:28

+0

Pitts感謝:) – LiamB 2010-05-24 12:40:30

1

我喜歡下面的辦法:有一個輔助類,這是否你的東西,像(僞):

class DropdownLogic { 
    public DropdownLogic(MyModel model) { /* blah */ } 

    public ListOfDropdownItems ToDropdown() { 
     /* do something with model and transform the items into items for the dropdownlist */ 
     // f.e. set the item that matches model.GroupId already as selected 
    } 
} 

添加在你的模型:

public DropdownLogic Groups { get; set; } 

而在你的看法:

<%=Html.Dropdown(Model.Groups.ToDropdown())%> 
3

我用一個viewmodel爲這個與字典(我喜歡mvc contrib的選擇框)包含所有的性能是這樣的:

class LeViewModel { 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public int GroupID { get; set; } 
    public Dictionary<string, string> Groups {get; set;} 
} 

然後在你看來你只需要做

<%: Html.Select(m => m.GroupId).Options(Model.Groups) %> 

希望它能幫助。

+0

你如何分配這個? – 2011-04-13 20:48:14