【问题标题】:Binding array to multiple DropDownListFor将数组绑定到多个 DropDownListFor
【发布时间】:2013-02-06 19:28:35
【问题描述】:

我有一个场景,我想从复选框列表中选择 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" })

现在下拉菜单已正确创建,并且正确的值被绑定,在 POST 上,我看到值在视图模型中被发送回。

我只是无法让选择值显示在下拉列表中。重新加载页面后,下拉菜单仍然是空白的。

我在这里做错了什么?这甚至可能吗?

【问题讨论】:

  • 您好 Fran,如果列表很长,为什么不考虑另一种解决方案,例如实现一个 jquery 选择列表插件,例如 loopj.com/jquery-tokeninput 中的一个插件,看看它是否适合您的场景?与复选框列表不同,这将显示一个下拉列表,您可以从中选择条目。您选择的每个条目都将列在文本区域中

标签: asp.net-mvc razor model-binding html.dropdownlistfor


【解决方案1】:

您的问题与here 的描述有关。

阅读选择

如果您使用相同的模型来接受来自编辑视图的输入 在回发期间,您可能会认为默认模型绑定器会 使用所有专辑信息重新填充专辑集合,并 设置所选专辑。不幸的是——网络不是这样工作的 并且相册集合将为空。

所以你必须有一个像这样的 ViewModel:

public class LarcenyViewModel
{
    public int CheckedLarcenyType1 { get; set; }
    public int CheckedLarcenyType2 { get; set; }
    public int CheckedLarcenyType3 { get; set; }             
    public IEnumerable<SelectListItem> LarcenyTypes { get; set; }
}

像这样填充 ViewModel:

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" })

【讨论】:

  • 我已经阅读了您提到的帖子,实际上这不是我看到的问题。我不希望模型绑定器绑定整个对象。我只是希望下拉列表能够像帖子中的任何其他 html 对象一样工作。如果输入对象只有一个名称,我的理解是它将绑定来自所有同名对象的值,它将这些项目的值绑定到任何类型的数组中。我似乎遗漏了一个关键部分,即我的视图模型。 CheckedLarcenyTypes 被定义为 Int32[]。这应该允许模型绑定器绑定值。
  • 我理解您对此的不满,但对于ASP.NET MVC,事情不会这样运作。我建议您阅读这篇文章以了解如何建模绑定到列表和数组类型:haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
  • 我创建了一个示例应用程序,展示了如何在操作方法中将数据绑定到数组参数。你可以看这里:github.com/leniel/AspNetMvcArrayDataBinding
  • 我发现我需要将 Model.LarcenyTypes 调整为 new SelectList(Model.LarcenyTypes, "LarcenyId", "Name") 以便我可以取消设置下拉菜单。否则,它们都使用相同的 SelectList 实例,并且一旦设置了一个实例,它们都会显示选择的值。
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多