我很烦恼应该是一个非常简单的视图,其中包含一个包含复选框的项目列表。
@for (int i = 0; i < Model.ApiKeys.Count; i++)
{
<tr>
<td>@Html.TextBoxFor(m => m.ApiKeys[i].Name, new { @class = "api-input-150" })</td>
<td>@Html.CheckBoxFor(m => m.ApiKeys[i].Remove, new { @class = "api-input-50" })</td>
</tr>
}
当表单提交时,我删除任何标记为要删除的项目,然后返回包含新数据集的视图。
我所看到的是,如果列表仍包含与帖子中删除的行之一具有相同索引的项目,则即使Remove属性的值设置为false,也会错误地检查项目复选框。
E.g。 3项目清单&gt;删除第2项&gt;视图呈现时,将检查列表中的第2项。
3项列表&gt;删除第3项&gt;在结果视图中没有检查项目
4项清单&gt;删除项目1&amp; 2&gt;在结果视图中检查剩余的项目
如果我刷新页面然后正确呈现所以我通过执行RedirectToAction强制GET到视图而不是仅仅从POST返回视图但是想知道出了什么问题以及如何我可以妥善解决这个问题。
以下是两个操作的实际代码段:
public ActionResult Index()
{
return View(GetSettings());
}
[HttpPost]
public ActionResult Index(Model.Setup settings)
{
if (ModelState.IsValid)
{
SaveSettings(settings);
return View(GetSettings());
}
else
{
return View(settings);
}
}
鉴于我的基础数据都已正确更新,这只发生在POST的响应中我想知道是否有某种浏览器功能正在缓存已检查状态并覆盖我的视图实际尝试的内容渲染...
......或许这里有一个真正的简单错误,我盯着它看错了太久了!
答案 0 :(得分:5)
您需要从ModelState中删除您在POST操作中修改的任何属性,否则HTML帮助程序仍将使用旧值。例如:
if (ModelState.IsValid)
{
ModelState.Clear();
SaveSettings(settings);
return View(GetSettings());
}