【问题标题】:ASP.NET MVC2: DropDownListFor doesn't work properly with multiple selection + modelbinderASP.NET MVC2:DropDownListFor 不能与多选 + modelbinder 一起正常工作
【发布时间】:2011-02-02 01:06:05
【问题描述】:

我试图弄清楚这个 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 是用户类的一个字段(它是我的视图模型的成员):

public List<String> AssociatedGroups { get; set; }

这里没有什么特别之处。 如果我使用此代码,我将看不到所选下拉列表的元素(并且它们具有属性集,我已仔细检查过),但我可以在发布表单时将选择与 AssociatedGroups 绑定。 如果我用字符串更改 AssociatedGroups(用户类的字段):

public String AssociatedGroups { get; set; }

我有相反的行为:

我可以看到下拉列表的元素被选中,但是当我发布表单时没有绑定,或者更好的是,只有一个元素被绑定。 我一天中的大部分时间都在试图找出问题所在,我尝试了不同的组合,但它们似乎都不起作用。 有没有人可以帮助我?

谢谢。

【问题讨论】:

    标签: asp.net-mvc-2


    【解决方案1】:

    您的视图模型需要两个属性:一个包含选定的组 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
        ...
    }
    

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

    【讨论】:

    • 感谢 Darin,虽然我只更改了 SelectList 中的 DropDownListFor,但它很有帮助。粘贴后,我保留了所有其余部分,效果很好。谢谢。
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2014-07-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多