C# 集合在ViewModel中的数组上为只读
我有一个MVC ViewModel,如下所示:C# 集合在ViewModel中的数组上为只读,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个MVC ViewModel,如下所示: public class FruitBoxViewModel { public FruitBoxViewModel() { BoxLabels = new BoxLabelViewModel[3]; } public int Id { get; set; } public string Name { get; set; } public BoxLabelViewModel[] Bo
public class FruitBoxViewModel {
public FruitBoxViewModel()
{
BoxLabels = new BoxLabelViewModel[3];
}
public int Id { get; set; }
public string Name { get; set; }
public BoxLabelViewModel[] BoxLabels {get; set; }
}
一个注释请求查看BoxLabelViewModel
的外观,如下所示:
public class BoxLabelViewModel {
public string SkuCode {get; set;}
public int? ProductionNumber { get; set; }
}
每个水果盒
可以有1到3个盒子标签
,不多也不少。为了实现这一点,我想我应该使用数组
而不是列表
我的Razor视图中有一个for循环,用于处理我在页面上的输入:
@for(var i = 0; i < 3; i++ )
{
@Html.LabelFor(model => Model.BoxLabels[i].SkuCode)
@Html.EditorFor(m => Model.BoxLabels[i].SkuCode, new { htmlAttributes = new { @class = "form-control" } })
}
(变量i=0;i<3;i++)
{
@Html.LabelFor(model=>model.BoxLabels[i].SkuCode)
@EditorFor(m=>Model.BoxLabels[i].SkuCode,新的{htmlAttributes=new{@class=“form control”})
}
当我提交表格时,我会看到黄色的死亡屏幕(YSOD),上面有错误:
集合是只读的。
描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源
异常详细信息:System.NotSupportedException:集合为只读
是否有一条我不知道的规则规定您不应该在ViewModels或其他东西中使用数组?这是使用数组而不是列表的“抓到您”案例之一。模型绑定器不会创建数组的新实例,因为您在构造函数中提供了一个实例。然后它将使用它作为
IList
实例,并尝试调用Insert
或Add
,这样的调用对于数组将失败,对于列表将成功
在发送post请求之前,只需删除分配表单构造函数或使用模型中的列表,并编写一些JS来验证表单。然后验证服务器端的项目计数。BoxLabel和BoxLabelViewModel的定义是什么?其中一个是我已修复的打字错误,现在我为
BoxLabelViewModel
添加了代码,这是一个优化建议。对for
语句使用Model.Boxlabels.Length
(或Count
)而不是固定的数字3,这样,如果您选择修改项目计数,就不必在两个位置编辑数字。您是对的,我只放了3,因为我疯了,认为计数函数可能是罪魁祸首!这是不对的。DefaultModelBinder
将绑定到一个数组。真正的问题是设置BoxLabels=new-BoxLabelViewModel[3]的构造函数代码>-创建只读集合。只需删除该行,模型就会被正确绑定(已经说过,最好使用IList
,因为它允许您添加3个元素并使用for(int i=0;i