“The parameter ‘expression’ must evaluate to an IEnumerable when
multiple selection is allowed.”
请看下面的代码
//这是我的模特课
public class clslistBox{ public int id { get; set; } public int Supplierid { get; set; } public List<SuppDocuments> lstDocImgs { get; set; } public class SuppDocuments { public string Title { get; set; } public int documentid { get; set; } } public List<SuppDocuments> listDocImages() { List<SuppDocuments> _lst = new List<SuppDocuments>(); SuppDocuments _supp = new SuppDocuments(); _supp.Title = "title"; _supp.documentid = 1; _lst.Add(_supp); return _lst; } }
//这是我的控制器
[HttpGet] public ActionResult AddEditSupplier(int id) { clslistBox _lst = new clslistBox(); _lst.lstDocImgs= _lst.listDocImages(); return View(_lst); }
//这是我绑定listBoxfor的视图
@model clslistBox @using (Html.BeginForm("AddEditSupplier","Admin",FormMethod.Post)) { @Html.ListBoxFor(model => model.id,new SelectList(Model.lstDocImgs,"documentid","title")) }
任何人都可以看到它的原因吗?
解决方法
更新
但是,在我的答案结尾处看到一些可能不必要的详细说明为什么你没有第一次得到错误.
结束更新
您正在使用ListBoxFor – 它用于为用户提供多种选择功能 – 但您尝试将其绑定到int属性 – 这不支持多选. (它必须是IEnumerable< T>至少能够在MVC中默认将列表框绑定到它)
我认为你的意思是使用DropDownListFor – 即显示一个项目列表,只能从中选择一个项目?
如果你真的在列表框中寻找单选语义,那么在MVC中这很麻烦,因为它的Html助手完全适合用于多选的列表框. SO上的其他人问了一个关于如何让下拉列表看起来像列表框的问题:How do I create a ListBox in ASP.NET MVC with single selection mode?.
或者您可以自己为这样的列表框生成HTML.
(更新) – 可能不必要的详细说明(!)
您第一次没有获得异常的原因可能是因为在生成HTML时,ModelState中没有id值.这是感兴趣的反射MVC源(来自SelectExtensions.SelectInternal)(最后的GetSelectListWithDefaultValue调用是您的异常的来源):
object obj = allowMultiple ? htmlHelper.GetModelStateValue(fullHtmlFieldName,typeof(string[])) : htmlHelper.GetModelStateValue(fullHtmlFieldName,typeof(string)); if (!flag && obj == null && !string.IsNullOrEmpty(name)) { obj = htmlHelper.ViewData.Eval(name); } if (obj != null) { selectList = SelectExtensions.GetSelectListWithDefaultValue(selectList,obj,allowMultiple); }
首先请注意,控件变量allowMultiple在您的情况下为true,因为您已调用ListBoxFor. selectList是您创建的SelectList,并作为第二个参数传递. MVC(不幸的是在某些情况下)做的事情之一是使用ModelState来修改重新显示视图时传递的选择列表,以确保在重新选择通过POST时在ModelState中设置的值时视图被重新加载(这在页面验证失败时很有用,因为您不会将值从ModelState复制到基础模型,但页面仍然应该将这些值显示为已选中).
因此,您可以在第一行看到,模型的表达式/字段的当前值是从模型状态中捕获的;要么是字符串数组,要么是字符串.如果失败(返回null),那么它会再次执行表达式(或类似的)来获取模型值.如果从那里获得非空值,则调用SelectExtensions.GetSelectListWithDefaultValue.
正如我所说 – 你想要做的事情最终不会在Id或SupplierId的情况下起作用(因为它们需要是IEnumerable)但我相信这个ModelState-> Eval过程在你使用时会产生一个空值Id,因此跳过获取“已调整”的SelectList的过程 – 因此不会引发异常.当您使用SupplierId时,情况并非如此,因为我会打赌当时在ModelState中有值,或者ViewData.Eval成功获得整数值.
不抛出异常与工作不一样!
结束更新