当我将"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);
}
//这是我绑定listboxfor
的视图@model clslistbox
@using (Html.BeginForm("AddEditSupplier", "Admin", FormMethod.Post))
{
@Html.ListBoxFor(model => model.id, new SelectList(Model.lstDocImgs, "documentid", "title"))
}
有谁能看到它的原因?
答案 0 :(得分:16)
我认为这里表达式中属性的更改是一个红色的鲱鱼 - 在任何一种情况下它都不起作用。
<强> 更新 强>
然而,请在我的答案结尾处看到一些可能不必要的详细说明为什么你没有第一次得到错误。
结束更新
您正在使用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时id
中的ModelState
没有值。这是感兴趣的反射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
在您的情况下为真,因为您已调用ListBoxFor
。 selectList
是您创建的SelectList
,并作为第二个参数传递。 MVC(不幸的是在某些情况下)执行的操作之一是使用ModelState
来修改重新显示视图时传递的选择列表,以确保通过ModelState
中设置的值重新加载视图时重新选择POST(当页面验证失败时这很有用,因为您不会将值从ModelState
复制到基础模型,但页面仍然应该将这些值显示为已选中)
因此,您可以在第一行看到,模型的表达式/字段的当前值是从模型状态中捕获的;要么是字符串数组,要么是字符串。如果失败(返回null
),那么它会再次执行表达式(或类似的)来获取模型值。如果从那里获得非空值,则会调用SelectExtensions.GetSelectListWithDefaultValue
。
正如我所说 - 你要做的事情最终不适用于Id
或SupplierId
(因为它们需要IEnumerable
)但是我相信当您使用ModelState
时,此Eval
- &gt; Id
进程会产生空值,因此获得“调整后的”SelectList
的过程被跳过 - 因此不会引发异常。当您使用SupplierId
时,情况并非如此,因为我会下注,此时ModelState
中有值,或者ViewData.Eval
成功获得整数值。
不抛出异常 与 正常工作 相同!。
结束更新
答案 1 :(得分:0)
尝试将属性从int更改为int []
class HourLogging extends Model
{
public function order()
{
return $this->belongsTo('App\Models\Order', 'order_id', 'id');
}
$timeoverview = HourLogging::select('hour_logging.*')->whereRaw("hour_logging.date BETWEEN '".$start_date."' AND '".$end_date."'")->orderBy('date','asc');
$timeoverview->with('order.customer');
return $timeoverview->get();
}
class Order extends Model {
public function customer() {
return $this->belongsTo('App\Models\Customer');
}
}
假设上面是用于绑定模型的类,请尝试更改documentmentid属性,如下所示
public class SuppDocuments
{
public string Title { get; set; }
public int documentid { get; set; }
}