我正在使用实体框架,我在产品和类别之间存在多对多的关系。我已经创建了我的模型,他们似乎正确地创建了表格。现在我正在尝试插入产品并收到错误:“值不能为空。”在线: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行中有问题,也许我的模型也有问题,但我不确定。
答案 0 :(得分:1)
属性model.ProductCategories
为ICollection<CategoryModel>
。您不能将<select multiple>
绑定到复杂对象的集合,只能绑定值类型的集合。假设Category.ID
是int
的类型,那么您的模型需要一个属性(比如说)
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个选项。