所以我正在制作包含对象列表的表格。因为它的列表在开始时无法设置一定数量的输入字段,所以我发现每次单击按钮都将重新加载传递给当前模型的视图。因此,每次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; }
答案 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包装到一个标记中,该标记会将新值发布到您的控制器。然后,使用新的项目再次渲染视图。