我有一个ASP.NET 4.5.6 MVC 5应用程序。以下是我的模型/视图/控制器的摘要:
模型类
public class ViewModelA {
public ViewModelB CurrentItem { get; set; }
// ...
}
public class ViewModelB {
public List<Parameter> Parameters { get; set; }
// ...
}
public class Parameter {
public string Name { get; set; }
public int Position { get; set; }
// ...
}
查看
@model ViewModelA
@* ... *@
@for (int i = 0; i < Model.CurrentItem.Parameters.Count; i++) {
@Html.EditorFor(m => m.CurrentItem.Parameters[i])
}
〜/查看/共享/ EditorTemplates / Parameter.cshtml
@model Parameter
<tr>
<td class="col-md-3">
</td>
<td class="col-md-9">
@Html.TextBoxFor(m => m.Position)
@Html.TextBoxFor(m => m.Name)
@* Model.Position always equals list index + 1 *@
<button type="submit" class="btn btn-default" formaction="@Url.Action("DeleteParameter", "MyController", new { deleteIndex = (Model.Position - 1) })" for formmethod="post" title="Delete parameter">
<i class="glyphicon glyphicon-minus"></i>
</button>
<!-- Debug only -->
<span>Position = @Model.Position | Name = @Model.Name</span>
</td>
</tr>
控制器操作
[HttpPost]
public ActionResult AddParameter(ViewModelA viewModel) {
var p = new Parameter() {
Name = "",
Position = (byte)(viewModel.CurrentItem.Parameters.Count + 1)
//...
};
viewModel.CurrentItem.Parameters.Add(p);
return View("Edit", viewModel);
}
[HttpPost]
public ActionResult DeleteParameter(int deleteIndex, ViewModelA viewModel) {
viewModel.CurrentItem.Parameters.RemoveAt(deleteIndex);
for (int i = deleteIndex; i < viewModel.CurrentItem.Parameters.Count; i++) {
viewModel.CurrentItem.Parameters[i].Position--;
}
return View("Edit", viewModel);
}
这是一张图片,显示添加几个参数后删除一个参数后的一系列屏幕截图。刷新后,水平红线将每个屏幕分开。
删除位置1中的参数后,我希望其余参数的名称为“Name2”,但仍显示“Name1”(即使“调试范围文本”显示正确的名称)。控制器和模型似乎正在做我期望的事情。为什么视图中的文本框显示错误的名称?