C# 为列表呈现的输入字段ArgumentOutOfRangeException<;对象>;

C# 为列表呈现的输入字段ArgumentOutOfRangeException<;对象>;,c#,asp.net,asp.net-mvc,asp.net-core,C#,Asp.net,Asp.net Mvc,Asp.net Core,所以我在制作表单,其中包括对象列表。由于它的列表,我无法在开始时设置输入字段的数量,所以我发现每次单击按钮时,我都会重新加载传递给它当前模型的视图。所以每次Model.Cargo.Count都会更高,它应该为已经存在的列表项呈现输入字段,为新列表项呈现一个额外的字段 开始时,我有一个输入字段[0],它正确显示,因此我填充它并按下按钮,然后在调试时,它使用我先前填充的数据为现有对象正确创建[0]字段,但当它尝试为另一个项目渲染字段[1]时,我遇到错误ArgumentOutOfRangeExcept

所以我在制作表单,其中包括对象列表。由于它的列表,我无法在开始时设置输入字段的数量,所以我发现每次单击按钮时,我都会重新加载传递给它当前模型的视图。所以每次
Model.Cargo.Count
都会更高,它应该为已经存在的列表项呈现输入字段,为新列表项呈现一个额外的字段

开始时,我有一个输入字段
[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; }

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

这将解决
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>
        }

}
@{
bool myListIsEmpty=Model?.Cargo==null | | |!Model?.Cargo.Any();
var myList=myListIsEmpty
?新建列表(){new Cargo()}//在列表中添加新的空项。
:Model.Cargo;//“复制”您的模型列表
@for(int i=0;i
要在列表中添加更多项,您需要将for循环的每个结果的html包装到一个标记中,该标记将向控制器发布新值。然后使用新的ITEN再次渲染视图