Asp.Net MVC Handle下拉框不属于该模型

我有一个小表单,用户必须填写并包含以下字段。

名称(文本)值(文本)组(组 – 是从数据库表中提取的选项列表)

现在这个视图的模型看起来像这样,

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

现在,视图强烈键入上述模型。

使用什么方法填充下拉列表? 由于数据不包含在模型中(可能包含在模型中)我们应该使用Temp / View数据吗? HTML助手? 实现这一目标的理想方式是什么。

注意:这假设您使用的是MVC2。

如果我需要强类型下拉列表(在这种情况下是一个国家/地区列表),我在ViewModel上使用了2个属性。

  public IEnumerable Countries { get; set; } public int CountryID { get; set; } 

我使用与此类似的代码在我的操作中将我的列表预转换为IEnumerable 。 (这假定具有名称和唯一ID的国家/地区类)。

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

然后在我的强类型视图中,我使用:

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

这很好,因为当您回发到强类型操作(接收相同的视图模型)时, CountryID将是所选国家/地区的ID。

另一个好处,如果他们有validation问题。 您需要做的就是重新填充.Countries列表,将viewmodel传递回视图,它将自动选择正确的值。

我使用一个viewmodel与一个字典(我喜欢mvc contrib的选择框)包含所有属性,如:

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

然后在你看来你只需要做

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

希望能帮助到你。

我喜欢以下方法:有一个助手类为你做这件事,比如(伪):

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

添加您的模型:

  public DropdownLogic Groups { get; set; } 

在你看来:

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