为List <object>呈现的输入字段的ArgumentOutOfRangeException

时间:2019-11-22 23:55:20

标签: c# asp.net asp.net-mvc asp.net-core

所以我正在制作包含对象列表的表格。因为它的列表在开始时无法设置一定数量的输入字段,所以我发现每次单击按钮都将重新加载传递给当前模型的视图。因此,每次Model.Cargo.Count更高时,它应该为已存在的列表项呈现输入字段,并为新的列表项呈现另一个字段。

开始时我有1个输入字段[0],它会正确显示,因此我将其填充并按下按钮,然后在进行调试时,它会为现有对象正确地创建[0]字段,并填充我的数据较早,但是当它尝试呈现其他项[1]的字段时,出现错误ArgumentOutOfRangeException

当“列表”为空(为null)时,我可以输入任意数量的输入,但是当列表中至少有一项时,我无法添加更多内容。

如何将更多项目添加到列表中?

部分视图:

@{
                int count = 0;
                if(Model != null)
                {
                    if(Model.Cargo != null)
                    {
                        count = Model.Cargo.Count;
                    }
                }
                count++;
                }
            @for (int i = 0; i < count; i++)
            {
                <div class="form-group">
                    <label asp-for="Cargo[i].Amount" class="control-label"></label>
                    <input asp-for="Cargo[i].Amount" class="form-control" />
                    <span asp-validation-for="Cargo[i].Amount" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <select asp-for="Cargo[i].CargoTypeId" class="form-control" asp-items="ViewBag.CargoTypes"></select>
                    <span asp-validation-for="Cargo[i].CargoTypeId" class="text-danger"></span>
                </div>
            }

查看模型:

[...]
List<Cargo> Cargo { get; set; }

货物型号:

[...]
int Amount { get; set; }
int CargoTypeId { get; set; }

1 个答案:

答案 0 :(得分:0)

您可以完成以下操作:创建一个新变量,当列表中有项目时,该变量将成为列表的“副本”。或当列表中没有值时,使用新的空项目作为新列表。

这将解决ArgumentOutOfRangeException

的问题

由于视图模型是只读的,因此您需要使用新变量。

@{

    bool myListIsEmpty = Model?.Cargo == null || !Model?.Cargo.Any();
    var myList = myListIsEmpty 
        ? new List<Cargo>() { new Cargo() } //Add new empty item on list.
        : Model.Cargo; // "Copy" of your List from your model


        @for (int i = 0; i < myList.Count; i++)
        {
            <div class="form-group">
                <label asp-for="Cargo[i].Amount" class="control-label"></label>
                <input asp-for="Cargo[i].Amount" class="form-control" />
                <span asp-validation-for="Cargo[i].Amount" class="text-danger"></span>
            </div>
            <div class="form-group">
                <select asp-for="Cargo[i].CargoTypeId" class="form-control" asp-items="ViewBag.CargoTypes"></select>
                <span asp-validation-for="Cargo[i].CargoTypeId" class="text-danger"></span>
            </div>
        }

}

要在列表中添加更多项目,您需要将for循环的每个结果html包装到一个标记中,该标记会将新值发布到您的控制器。然后,使用新的项目再次渲染视图。