MVC复选框列表 - 发布后错误检查的项目

Chr*_*s W 1 checkbox asp.net-mvc-3

我对一个简单的视图有一个烦恼,这个视图有一个包含复选框的项目列表.

@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>    
        }
Run Code Online (Sandbox Code Playgroud)

当表单提交时,我删除任何标记为要删除的项目,然后返回包含新数据集的视图.

我所看到的是,如果列表仍包含与在帖子上删除的行之一具有相同索引的项目,则即使Remove属性的值设置为false,也会错误地检查项目复选框.

例如,3个项目的列表>删除项目2>在视图渲染时检查列表中的第2个项目.

3项目清单>删除项目3>在结果视图中未选中任何项目

4项目清单>删除项目1和2>在结果视图中检查剩余项目

如果我刷新页面然后正确呈现所以我通过执行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);
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于我的基础数据都已正确更新,这只发生在POST的响应中我想知道是否有某种浏览器功能正在缓存已检查状态并覆盖我的视图实际上尝试渲染的内容. .

......或者这里有一个真正的简单错误,我盯着它看错了太久了!

Dar*_*rov 5

您需要从ModelState中删除您在POST操作中修改的任何属性,否则HTML帮助程序仍将使用旧值.例如:

if (ModelState.IsValid)
{
    ModelState.Clear();
    SaveSettings(settings);
    return View(GetSettings());
}
Run Code Online (Sandbox Code Playgroud)