ListBoxFor不在帖子之间取消选择

本文关键字:之间 取消 选择 ListBoxFor | 更新日期: 2023-09-27 18:20:17

我在视图中有以下代码:

<div class="row form-group">
    @Html.LabelFor(x => x.GroupCriteria.Name, Translation.Name, new { @class = "col-sm-4 control-label" })
    <div class="col-sm-4">
        @Html.ListBoxFor(m => m.GroupCriteria.Name, Model.NameList, new { @class = "multi-select-custom" })
    </div>
</div>
...
<button type="submit" name="removeCriterion" value="Name">X</button>Name: @(string.Join(",", Model.GroupCriteria.Name))</button>
...
<button type="submit">@Translation.Update</button>

在控制器中:

public ActionResult GetUsers(GroupCriteriaModel groupCriteria, string removeCriterion)
{
    if("Name".Equals(removeCriterion)) groupCriteria.Name.Clear();
    ...
    return View(modelWithCriterias);
}

现在发生了什么:

当我通过点击select然后点击"Update"来选择/取消选择一些值时,一切都很好:返回页面中的选择与发布的内容相同。

现在我点击"X"清除"名称"。"removeCcriterion"等于"Name",所以Name列表被清除(在调试器中我看到它是空的)。视图中的调试器:"Model.GroupCriteria.Name"仍然为空,"Model.NameList"中没有"Selected"(设置为true)。但返回的HTML包含和以前相同的选择(相同的项目具有属性"selected="selected")。

这是MVC做的某种缓存吗?如何避免这种情况?

ListBoxFor不在帖子之间取消选择

很可能是从ModelState绑定的,所以应该清除它:

if("Name".Equals(removeCriterion))
{
    groupCriteria.Name.Clear();
    ModelState.Clear();
}

如果您想以更具体的方式执行操作,可以使用ModelState.Remove()来仅删除与ListBox相关的状态。