如何保存多个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; }
成分:
public string Description { get; set; }
public int Id { get; set; }
我必须更改助手的名称和id才能保存数据?
您正试图将选定的值绑定到Ingredients集合中。然而,如果你看一下发布的值,它们会看起来像这样:
。。。成分=1&成分=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
对象。这将需要您编写自己的模型活页夹,并将其配置为Ingredient类型。然而,您将只收到发布值中的id,因此您必须检索其他属性(可能来自数据库),或者您将有一个Ingredient对象集合,其中只填充id。除非你真的需要,否则我不会走这条路