我试图弄清楚这个DropDownListFor是如何工作的,但没有成功 我的控制器创建了一个SelectListItems列表,我在其中放置了在数据库中找到的所有组:
viewModel.Groups = LoadGroups(viewModel.User.AssociatedGroups);
这个方法:
private IList<SelectListItem> LoadGroups(List<String> associatedGroups)
{
var groups = _SecurityService
.LoadGroups()
.Select(e => new SelectListItem
{
Selected = associatedGroups.Contains<System.String>(e.Id.ToString()),
Value = e.Id.ToString(),
Text = e.Name
}).ToList();
return (groups);
}
如您所见,如果列表中有关联的组,我会设置Selected元素。 我把这个列表放在我的自定义视图模型的字段(组)中:
public class UsersViewModel
{
public UsersViewModel()
{
this.Groups = new List<SelectListItem>();
}
public Models.User User { get; set; }
public IList<SelectListItem> Groups { get; set; }
}
并将UsersViewModel发送到视图。我使用此代码构建具有多选的下拉列表:
<%=Html.DropDownListFor(m => m.User.AssociatedGroups, (List<System.Web.Mvc.SelectListItem>)Model.Groups, new { @class = "dropDownGroups", multiple = "multiple" })%>
AssociatedGroups是类Users(它是我的viewmodel的成员)的字段:
public List<String> AssociatedGroups { get; set; }
这里没什么特别的。 如果我使用此代码,我可以看不到所选下拉列表的元素(并且它们具有属性集,我已经双重检查过),但是当我发布表单时,我可以将选择与AssociatedGroups绑定。 如果我用字符串更改AssociatedGroups(User类的字段):
public String AssociatedGroups { get; set; }
我有相反的行为:
我可以看到下拉列表的元素被检查但是当我发布表单时没有绑定,或者更好,只绑定了一个元素。 我花了大部分时间试图弄清楚问题是什么,我尝试了不同的组合,但它们似乎都没有效果。 有没有人可以试着帮我?
感谢。
答案 0 :(得分:3)
您的视图模型需要两个属性:一个包含选定的组ID,另一个包含列表:
public class UsersViewModel
{
public IEnumerable<SelectListItem> Groups { get; set; }
public IEnumerable<string> SelectedGroupIds { get; set; }
}
然后你会使用ListBoxFor
助手来做出多种选择:
<%= Html.ListBoxFor(
m => m.SelectedGroupIds,
new SelectList(Model.Groups, "Value", "Text"),
new { @class = "dropDownGroups" }
) %>
现在假设将以下视图模型传递给视图:
public ActionResult Index()
{
var model = new UsersViewModel
{
// TODO: Use a repository to fetch those values
// and map them to the view model
Groups = new[]
{
new SelectListItem { Value = "1", Text = "group 1" },
new SelectListItem { Value = "2", Text = "group 2" },
new SelectListItem { Value = "3", Text = "group 3" },
},
// We want to preselect the last two groups in the listbox
SelectedGroupIds = new[] { "2", "3" }
};
return View(model);
}
[HttpPost]
public ActionResult Index(IEnumerable<string> selectedGroupIds)
{
// Here we will get the list of selected ids
// when the form containing the listbox is
// submitted
...
}
然后在视图中,将自动预选最后两个元素。