如何为多个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才能保存数据吗?
答案 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对象的集合。除非你真的需要,否则我不会沿着这条路走下去。