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再次渲染视图