ListBoxFor MultiSelectList不选择值

时间:2017-02-09 00:53:13

标签: asp.net-mvc asp.net-mvc-5

我非常困惑,因为这似乎应该很简单,但我不能让我的ZipRequest input = JsonConvert.DeserializeObject<ZipRequest>(req.Body); 填充选定的值。我已经查看了其他几个答案,但我无法弄清楚我做错了什么。

这是我的模特:

ListBox

这是我的控制器动作:

public class ItemViewModel
{
    public IEnumerable<Item> AllItems { get; set; }
    public IEnumerable<Item> SelectedItems { get; set; }
}

public class Item
{
    public string Id { get; set; }
    public string Name { get; set; }
}

这是我视图中的一行(使用默认的MVC视图模板):

public ActionResult ListBoxTest()
{
    var viewModel = new ItemViewModel()
    {
        AllItems = new List<Item>()
        {
            new Item()
            {
                Id = "1",
                Name = "Name1"
            },
            new Item()
            {
                Id = "2",
                Name = "Name2"
            }
        },
        SelectedItems = new List<Item>()
        {
            new Item()
            {
                Id = "1",
                Name = "Name1"
            }
        }
    };
    return this.View(viewModel);
}

我也尝试省略所选的值:

@Html.ListBoxFor(m => m.SelectedItems, new MultiSelectList(Model.AllItems, "Id", "Name", Model.SelectedItems.Select(s => s.Id)), new { multiple = "multiple"})

将所选值设为列表:

@Html.ListBoxFor(m => m.SelectedItems, new MultiSelectList(Model.AllItems, "Id", "Name"), new { multiple = "multiple"})

但无论我做什么,都不会选择列表项。我做错了什么?

1 个答案:

答案 0 :(得分:4)

您无法将<select>元素绑定到复杂对象的集合。多重选择仅回发一组简单值 - 所选选项的值。

您的模型需要

public class ItemViewModel
{
    public IEnumerable<Item> AllItems { get; set; }
    public IEnumerable<int> SelectedItems { get; set; }
}

并在控制器中

SelectedItems = new List<int>(){ 1 }

然后使用

@Html.ListBoxFor(m => m.SelectedItems, new SelectList(Model.AllItems, "Id", "Name")

将选择下拉列表中的第一个选项。

请注意,ListBoxFor()方法设置multiple="multiple",因此无需再次设置它。此外,在SelectList()(或MultiSelectList())构造函数中设置最后一个参数是没有意义的。它的绑定属性值确定了所选内容,ListBoxFor()方法在内部忽略该参数。

我还建议你的财产应该是

public IEnumerable<SelectListItem> AllItems { get; set; }

这样您就可以使用

@Html.ListBoxFor(m => m.SelectedItems, Model.AllItems)