我非常困惑,因为这似乎应该很简单,但我不能让我的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"})
但无论我做什么,都不会选择列表项。我做错了什么?
答案 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)