ASP.NET MVC2:DropDownListFor无法与多个选择+ modelbinder一起正常工作

时间:2011-02-01 16:48:43

标签: asp.net-mvc-2

我试图弄清楚这个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; }

我有相反的行为:

我可以看到下拉列表的元素被检查但是当我发布表单时没有绑定,或者更好,只绑定了一个元素。 我花了大部分时间试图弄清楚问题是什么,我尝试了不同的组合,但它们似乎都没有效果。 有没有人可以试着帮我?

感谢。

1 个答案:

答案 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
    ...
}

然后在视图中,将自动预选最后两个元素。