我有一个MVC ViewModel,如下所示:
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; }
}
每个FruitBox
可以有1到3个BoxLabels
,不多也不少。为了强制执行,我想我会使用Array
代替List
。
我的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" } })
}
当我提交表格时,我得到黄色死亡屏幕(YSOD),错误:
收藏是只读的。
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.NotSupportedException:Collection是只读的。
是否存在一条我不知道的规则,说您不应该在ViewModel中使用数组?
答案 0 :(得分:3)
这是“你得到的”之一。使用数组而不是列表的情况。模型绑定器不会创建数组的新实例,因为您在构造函数中提供了一个实例。然后它将它用作IList
实例并尝试调用Insert
或Add
,这样的调用将对阵列失败并成功进行列表。
在发送帖子请求之前,只需删除作业表单构造函数或使用模型中的列表并编写一些JS来验证表单。然后验证服务器端的项目数。