【问题标题】:Save DropDownListFor multiple selected values为多个选定值保存 DropDownList
【发布时间】:2014-01-11 11:34:36
【问题描述】:

如何为多个 DropDownListFor 保存数据?我有此代码,但所选项目没有到达控制器。

我的代码视图:

@Html.DropDownListFor(model => model.Ingredients, new SelectList(Model.ListIngredients, "Id", "Description"), "Select the ingredients", new { multiple = "multiple", })

我的模特:

public ICollection<Ingredient> Ingredients { get; set; }
public ICollection<Ingredient> ListIngredients{ get; set; }

Ingredient.cs:

public string Description { get; set; }
public int Id { get; set; }

我必须更改助手的名称和 ID 才能保存数据?

【问题讨论】:

标签: html asp.net-mvc-3 asp.net-mvc-4 html-helper html.dropdownlistfor


【解决方案1】:

您正在尝试将所选值绑定到成分集合中。 但是,如果您查看发布的值,它们将如下所示:

...Ingredients=1&Ingredients=2...

这意味着模型绑定器将不知道如何将诸如 1,2(即成分 ID)之类的值转换为成分类的实例。


您需要更改视图模型的属性,您将在其中获取用户选择的成分,而不是成分的集合:

public ICollection<Ingredient> Ingredients { get; set; }

您有一组 Id(这是您用作多选值的属性),例如:

public int[] SelectedIngredients { get; set; }

(我已经重命名了属性,但这并不是绝对需要的,我这样做只是为了清楚起见)

作为建议,我会从该多选中删除默认选项值(“选择成分”选项)并使用标签或工具提示。否则,它可能看起来像列表中的任何其他值,您将不得不处理用户选择该选项的情况,这不是有效的成分。

更好的是,我还会使用 @Model.ListBoxFor 帮助器,因为这会让每个人都知道他们正在处理多选。否则(使用下拉助手),除非您查看属性,否则您可能不会意识到它是多选。比如:

 @Html.ListBoxFor(m=>m.SelectedIngredients, new SelectList(Model.ListIngredients, "Id", "Description"))

当然,这些只是建议。如果它们不符合您的要求,您可以愉快地忽略它们!

作为最后的评论,可以将发布的值转换为 Ingredient 对象,就像您最初在视图模型中所做的那样。这将需要您编写自己的模型绑定器并将其配置为成分类型。但是,您只会收到发布值中的 id,因此您必须检索其他属性(可能从数据库中),否则您将拥有一个仅填充 Id 的成分对象集合。除非你真的需要,否则我不会走这条路。

【讨论】:

  • 我的老板不希望我为此使用 viewModel,而是由其他团队负责该模型,他们需要收集成分(带有 ID 和描述)。我知道只需更改助手的名称和(我想)ID就可以做我想做的事。例如,我知道名称必须类似于Name="Ingredients[]"。但我尝试了所有名称和 ID(例如:Name="Ingredients[].Id", id="Ingredients[]_Id"),但什么也没有
  • 我不认为你能做到这一点,除非你有一个简单类型的集合,比如 int 或 string。原因是 select 有一个单一的 name 属性,因此所有选定的值将始终使用该名称发布。对于您想要的(复杂对象的集合),您需要发布名称,例如 Ingredients[0].IdIngredients[1].Id。有关模型与集合绑定的更多信息,请参阅 this linkthis link
  • @Ninita,除此之外,您仍然可以选择创建自定义模型绑定器
  • 我的老板已经说过,这样做是不可想象的,因为他们已经尝试过并且失败了
  • 如果您放弃这些选项,那么您可能需要考虑替代方法,例如为每种成分呈现一个复选框。它适用于每个复选框的名称属性为 Ingredients[XX].Id 及其值 Id,如 &lt;input type="checkbox" name="Ingredients[0].Id" value="1"/&gt;。因为只会发布已检查的成分,所以您需要解决非顺序发布的索引as explained here。您可以将其包装在 EditorTemplate 中并执行 @Html.EditorFor(m =&gt; m.Ingredients)
猜你喜欢
  • 2015-12-27
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多