保存DropDownList为多个选定的值

时间:2013-12-23 09:15:17

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

如何为多个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才能保存数据吗?

1 个答案:

答案 0 :(得分:0)

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

<强> ...成分= 1&安培;配料= 2 ...

这意味着模型绑定器不会知道如何将1,2(它们是成分Ids)等值转换为成分类的实例。


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

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对象,就像您最初在视图模型中一样。这将要求您编写自己的模型绑定器并为Ingredient类型配置它。但是,您只会在已发布的值中收到ID,因此您必须检索其他属性(可能来自数据库),或者您将拥有一个仅包含Id的Ingredient对象的集合。除非你真的需要,否则我不会沿着这条路走下去。