C# 在对列表调用RemoveAt()之后,似乎可以工作,但当EditorFor呈现更新的列表时,仍然会显示removed字段
我正在尝试设置一个视图,用户可以在其中添加和删除人员列表。调试时,使用C# 在对列表调用RemoveAt()之后,似乎可以工作,但当EditorFor呈现更新的列表时,仍然会显示removed字段,c#,asp.net-mvc,razor,editorfor,C#,Asp.net Mvc,Razor,Editorfor,我正在尝试设置一个视图,用户可以在其中添加和删除人员列表。调试时,使用RemoveAt(I)删除项目后,列表将正确更新,并且在创建视图时检查模型时,删除的项目不存在。但是,在显示列表中每个项的for循环中调用EditorFor(x=>name)后,将呈现正确的项数,但值与模型包含的值不同 我正在使用中的技术来显示每个项目 相关代码: 控制器: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Persons(IList<Pe
RemoveAt(I)
删除项目后,列表将正确更新,并且在创建视图时检查模型时,删除的项目不存在。但是,在显示列表中每个项的for
循环中调用EditorFor(x=>name)
后,将呈现正确的项数,但值与模型包含的值不同
我正在使用中的技术来显示每个项目
相关代码:
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Persons(IList<Person> persons, string command)
{
if (!ModelState.IsValid && !command.StartsWith("Delete"))
return View(persons);
if (command == "AddNew")
{
List<Person> newPersons = persons?.ToList() ?? new List<Person>();
newPersons.Add(new Person());
return View(newPersons);
}
if (command.StartsWith("Delete"))
{
if (int.TryParse(command.Substring(6), out int i))
persons.RemoveAt(i);
else
ModelState.AddModelError("", "There was an error deleting the person.");
return View(persons);
}
return RedirectToAction(command == "Back" ? "Index" : "Summary");
}
Persons.cshtml:
@model IEnumerable<Person>
<div class="text-center">
<button type="submit" name="command" value="AddNew" class="btn btn-primary btn-lg">
Add another person
</button>
</div>
{
int i = 0;
foreach (Person person in Model)
{
@Html.EditorFor(x => person, "PersonTemplate", $"Persons[{i++}]")
}
}
<script type="text/javascript>
$(document).on("click", "button[value='Delete']", function() {
const r = $(this).parent().prev().find("select").attr("name");
const s = r.substring(8, r.indexOf("]"));
$(this).val(`Delete${s}`);
})
</script>
返回:@Html.EditorFor(x=>x.LastName)
安妮·沃克怎么了?在PersonTemplate中,this.Model
仍然显示FirstName=“Anne”
和LastName=“Walker”
,但输入值使用Larry Jones
无论我在列表中删除哪一个,都会发生这种情况。如果我在列表中有5个人,并且我删除了person#1,那么视图将显示person 1、person 2、person 3和person 4。如果我删除人员4,它仍然显示人员1、2、3和4。如果我删除人员5,它将显示人员1、2、3和4。为什么它不能从模型中呈现正确的值 从数组中删除项目时,已删除项目上方的所有项目将向下移动一个索引。因此1)A 2)B 3)C 4)D 5)E。当你删除项目3时,你得到1)A 2)B 3)D 4)E.@jdweng是正确的,但即使我将列表(删除项目后)转换为新列表并将其传递到视图中,原始项目仍会显示。EditorFor与模型包含的内容不匹配。那么创建数据时的模型和强制转换时的模型是不同的。@jdweng在视图中调试和查看模型时,它不包含在控制器中删除的名称。但它仍然会生成被删除的名称。我找到了它——我必须这样做,之后它就工作了。当你从数组中删除一个项目时,删除项目上方的所有项目都会向下移动一个索引。因此1)A 2)B 3)C 4)D 5)E。当你删除项目3时,你得到1)A 2)B 3)D 4)E.@jdweng是正确的,但即使我将列表(删除项目后)转换为新列表并将其传递到视图中,原始项目仍会显示。EditorFor与模型包含的内容不匹配。那么创建数据时的模型和强制转换时的模型是不同的。@jdweng在视图中调试和查看模型时,它不包含在控制器中删除的名称。但它仍然会生成被删除的名称。我想出来了——我不得不,在那之后,它起作用了。
@model IEnumerable<Person>
<div class="text-center">
<button type="submit" name="command" value="AddNew" class="btn btn-primary btn-lg">
Add another person
</button>
</div>
{
int i = 0;
foreach (Person person in Model)
{
@Html.EditorFor(x => person, "PersonTemplate", $"Persons[{i++}]")
}
}
<script type="text/javascript>
$(document).on("click", "button[value='Delete']", function() {
const r = $(this).parent().prev().find("select").attr("name");
const s = r.substring(8, r.indexOf("]"));
$(this).val(`Delete${s}`);
})
</script>
<div class="row px-3 pb-3">
<div class="col-lg-3 col-md-6">
@Html.LabelFor(x => x.FirstName, new { @class = "required" })
@Html.EditorFor(x => x.FirstName, new { htmlattributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(x => x.FirstName)
</div>
<div class="col-lg-3 col-md-6">
@Html.LabelFor(x => x.MiddleName)
@Html.EditorFor(x => x.MiddleName, new { htmlattributes = new { @class = "form-control" } })
</div>
<div class="col-lg-4 col-md-7">
@Html.LabelFor(x => x.LastName, new { @class = "required" })
@Html.EditorFor(x => x.LastName, new { htmlattributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(x => x.LastName)
</div>
</div>
<button type="submit" name="command" value="Delete" class="btn btn-outline-danger">
Delete
</button>
<input class="text-box single-line" id="Persons_1__FirstName" name="Persons[1].FirstName" type="text" value="Larry" />
<input class="text-box single-line" id="Persons_1__LastName" name="Persons[1].LastName" type="text" value="Jones" />