8

当我更改为时"model => model.id""model => model.Supplierid"我遇到了错误

“当允许多选时,参数‘表达式’必须评估为 IEnumerable。”

请看下面的代码

// 这是我的模型类

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);
    }

// 这是我绑定列表框的视图

@model clslistbox
@using (Html.BeginForm("AddEditSupplier", "Admin", FormMethod.Post))
{
    @Html.ListBoxFor(model => model.id, new SelectList(Model.lstDocImgs, "documentid", "title"))
}

任何人都可以看到它的原因吗?

4

2 回答 2

19

我认为这里表达式中属性的更改是一个红鲱鱼 - 在任何一种情况下都不会起作用。

更新

但是,请参阅我的答案末尾的一些可能不必要的详细说明,说明为什么您在第一轮没有收到错误。

结束更新

您正在使用ListBoxFor- 用于为用户提供多项选择功能 - 但您正在尝试将其绑定到一个int属性 - 该属性不支持多项选择。(它IEnumerable<T>至少需要在 MVC 中默认能够将列表框绑定到它)

我认为您的意思是使用DropDownListFor- 即显示只能从中选择一个的项目列表?

如果您实际上是在列表框中寻找单选语义,那么在 MVC 中会比较棘手,因为它的 Html 帮助程序完全围绕列表框进行多选。SO上的其他人问了一个关于如何让下拉列表看起来像列表框的问题:如何在具有单选模式的ASP.NET MVC中创建一个ListBox?.

或者您可以自己为这样的列表框生成 HTML。

(更新)- 可能不必要的详细说明(!)

第一次没有出现异常的原因可能是因为在生成 HTML 时idin没有任何价值。这是感兴趣ModelState的反映的 MVC 源(来自)(最后的调用是您的异常的来源):SelectExtensions.SelectInternalGetSelectListWithDefaultValue

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在您的情况下,控制变量为真,因为您调用了ListBoxFor. selectListSelectList您创建并作为第二个参数传递的。MVC(不幸的是,在某些情况下)所做的一件事是用于ModelState修改您在重新显示视图时传递的选择列表,以确保在视图显示时重新选择ModelState通过 POST设置的值重新加载(这在页面验证失败时很有用,因为您不会将值从 复制到基础模型ModelState,但页面仍应将这些值显示为被选中)。

因此,正如您在第一行所见,您传递的表达式/字段的模型当前值已脱离模型状态;作为字符串数组或字符串。如果失败(返回null),那么它会再次执行表达式(或类似的)以获取模型值。如果它从那里得到一个非空值,它会调用SelectExtensions.GetSelectListWithDefaultValue.

正如我所说 - 你试图做的事情最终不会在Idor的情况下工作SupplierId(因为它们需要是IEnumerable我相信这个ModelState->Eval过程在你使用时会产生一个空值Id,所以得到的过程跳过“调整” SelectList- 因此不会引发异常。当您使用时,情况并非如此,SupplierId因为我敢打赌,ModelState此时要么有一个值,要么ViewData.Eval成功获得一个整数值。

不抛出异常工作一样!

结束更新

于 2013-01-11T10:12:38.303 回答
0

尝试将您的属性从 int 更改为 int[]

 public class SuppDocuments
 {
    public string Title { get; set; }
    public int documentid { get; set; }
 }

假设上面是用于绑定模型的类,请尝试如下更改 documentid 属性

 public class SuppDocuments
 {
    public string Title { get; set; }
    public int[] documentid { get; set; }
 }
于 2016-08-05T11:54:42.967 回答