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

时间:2010-05-21 10:19:23

标签: c# asp.net asp.net-mvc

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

姓名(文字) 价值(文字) 组(组 - 是从数据库表中提取的选项列表)

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

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

现在视图已强烈输入上述模型。

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

3 个答案:

答案 0 :(得分: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) %>

希望它有所帮助。

答案 1 :(得分: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列表,将viewmodel传递回视图,它将自动选择正确的值。

答案 2 :(得分: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())%>