html listboxfor value不能为null

时间:2015-07-27 20:09:23

标签: asp.net-mvc entity-framework

我正在使用实体框架,我在产品和类别之间存在多对多的关系。我已经创建了我的模型,他们似乎正确地创建了表格。现在我正在尝试插入产品并收到错误:“值不能为空。”在线:func checkOrigin(config *Config, req *http.Request) (err error) { config.Origin, err = Origin(config, req) if err == nil && config.Origin == nil { return fmt.Errorf("null origin") } return err }

这是我的ProductModel:

Origin: http://localhost

以下是控制器中填充列表的方法:

@Html.ListBoxFor(model => model.ProductCategories, Model.CategorySelectList.Select(c => new SelectListItem { Text = c.Text, Value = c.Value }), new { @class = "chzn-select", data_placeholder = "Choose categorie(s)..."})

我可能在ListBoxFor行中有问题,也许我的模型也有问题,但我不确定。

1 个答案:

答案 0 :(得分:1)

属性model.ProductCategoriesICollection<CategoryModel>。您不能将<select multiple>绑定到复杂对象的集合,只能绑定值类型的集合。假设Category.IDint的类型,那么您的模型需要一个属性(比如说)

public int[] SelectedCategories { get; set; } // or List<int>

然后在视图中

@Html.ListBoxFor(m => m.SelectedCategories, Model.CategorySelectList, new { @class = "chzn-select", data_placeholder = "Choose categorie(s)..."})

在POST方法中,SelectedCategories将包含所选的类别ID。

另请注意Model.CategorySelectList已经IEnumerable<SelectListItem>,因此从中创建新的IEnumerable<SelectListItem>(就像使用.Select(c => new SelectListItem { Text = c.Text, Value = c.Value })一样,这只是无意义的额外开销。

此外,getCategories()方法中的以下代码也毫无意义。

if (id > 0 && cat.ID == id) { sli.Selected = true; }

由于您对模型属性的强绑定,其绑定的属性值决定了将选择哪些选项,而Selected属性SelectListItem被忽略。如果要预先选择选项,请在控制器中设置SelectedCategories的值。例如,如果model.SelectedCategories = new int[] { 1, 3 }且您的选项的值为1到10,则将选择第1个和第3个选项。