Asp.net mvc 将数组绑定到多个DropDownListFor

Asp.net mvc 将数组绑定到多个DropDownListFor,asp.net-mvc,razor,model-binding,html.dropdownlistfor,Asp.net Mvc,Razor,Model Binding,Html.dropdownlistfor,我有一个场景,我想从复选框列表中选择3项。这很好,但是如果复选框列表变长,页面看起来很笨拙。所以我想把它改成3个下拉列表。因此页面要小得多,但是没有一个下拉列表支持所选的值 所以我试过这样的代码 @Html.DropDownListFor(model => model.CheckedLarcenyTypes, new SelectList(Model.LarcenyTypes, "Key", "Value", Model.CheckedLarcenyTypes.Length > 0

我有一个场景,我想从复选框列表中选择3项。这很好,但是如果复选框列表变长,页面看起来很笨拙。所以我想把它改成3个下拉列表。因此页面要小得多,但是没有一个下拉列表支持所选的值

所以我试过这样的代码

@Html.DropDownListFor(model => model.CheckedLarcenyTypes, new SelectList(Model.LarcenyTypes, "Key", "Value", Model.CheckedLarcenyTypes.Length > 0 ? Model.CheckedLarcenyTypes[0] : null as Int32?), String.Empty, new { id = "Larceny1" })
@Html.DropDownListFor(model => model.CheckedLarcenyTypes, new SelectList(Model.LarcenyTypes, "Key", "Value", Model.CheckedLarcenyTypes.Length > 1 ? Model.CheckedLarcenyTypes[1] : null as Int32?), String.Empty, new { id = "Larceny2" })
@Html.DropDownListFor(model => model.CheckedLarcenyTypes, new SelectList(Model.LarcenyTypes, "Key", "Value", Model.CheckedLarcenyTypes.Length > 2 ? Model.CheckedLarcenyTypes[2] : null as Int32?), String.Empty, new { id = "Larceny3" })
现在,下拉列表被正确创建,正确的值被绑定,在一篇文章中,我看到值被发送回视图模型

我就是无法在下拉列表中显示selectvalue。重新加载页面时,下拉列表仍然为空


我做错了什么?这可能吗?

您的问题与所描述的内容有关

阅读选集

如果使用同一模型从“编辑”视图接受输入 在回发过程中,您可能认为默认的模型绑定器将 使用所有相册信息和内容重新填充相册集合 设置所选唱片集。不幸的是,网络不是这样工作的 相册集合将为空

因此,您必须具有如下视图模型:

public class LarcenyViewModel
{
    public int CheckedLarcenyType1 { get; set; }
    public int CheckedLarcenyType2 { get; set; }
    public int CheckedLarcenyType3 { get; set; }             
    public IEnumerable<SelectListItem> LarcenyTypes { get; set; }
}
LarcenyViewModel larcenyViewModel = new LarcenyViewModel();

// Use a database, enum or whatever to get the LarcenyTypes... :)
larcenyViewModel.LarcenyTypes = new SelectList(
               database.FindAllLarcenyTypes(), "LarcenyId", "Name");
查看代码:

@Html.DropDownListFor(model => model.CheckedLarcenyType1, Model.LarcenyTypes, String.Empty, new { id = "Larceny1" })
@Html.DropDownListFor(model => model.CheckedLarcenyType2, Model.LarcenyTypes, String.Empty, new { id = "Larceny2" })
@Html.DropDownListFor(model => model.CheckedLarcenyType3, Model.LarcenyTypes, String.Empty, new { id = "Larceny3" })

嗨,弗兰,如果列表很长,为什么不考虑一个替代的解决方案,比如实现一个jQuery PosiLable插件,比如找到一个插件来查看它是否能满足你的场景?与复选框列表不同,这将显示一个下拉列表,您可以从中选择条目。你选择的每一个条目都会列在我读过你提到的文章的文本区域中,实际上这不是我看到的问题。我不希望模型绑定器绑定整个对象。我只是希望dropdownlist的工作方式与post中的任何其他html对象非常相似。如果一个输入对象只有一个名称,我的理解是,它将绑定来自所有同名对象的值,并将这些项的值绑定到它指定的任何类型的数组中。我似乎遗漏了一个关键部分,那就是我的视图模型。CheckedLarcenyTypes定义为Int32[]。这应该允许模型绑定器绑定这些值。我理解您对此感到失望,但对于
ASP.NET MVC
来说,事情不是这样的。我建议您阅读这篇文章,了解如何对列表和数组类型进行绑定建模:我创建了一个示例应用程序,演示如何在action方法中对数组参数进行数据绑定。您可以在此处查看:我发现我需要将Model.LarcenyTypes调整为新的SelectList(Model.LarcenyTypes,“LarcenyId”,“Name”),以便取消下拉列表设置。否则,它们都使用SelectList的同一个实例,一旦设置了一个实例,它们都会显示所选的值。