Collection在ViewModel中的数组上只读

时间:2017-03-21 14:35:53

标签: 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[] 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中使用数组?

1 个答案:

答案 0 :(得分:3)

这是“你得到的”之一。使用数组而不是列表的情况。模型绑定器不会创建数组的新实例,因为您在构造函数中提供了一个实例。然后它将它用作IList实例并尝试调用InsertAdd,这样的调用将对阵列失败并成功进行列表。

在发送帖子请求之前,只需删除作业表单构造函数或使用模型中的列表并编写一些JS来验证表单。然后验证服务器端的项目数。