You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在页面刷新后保留DropDownListFor的选中项?

解决Bootstrap Multiselect刷新后保留选中项的问题

嘿,别着急,这个问题其实是因为bootstrap-multiselect初始化时没有读取Model里已选中的值,我给你一步步说怎么修复:

1. 先确认Model属性类型正确

你的KvedFilter必须是可枚举类型(比如List<int>、IEnumerable<int>),毕竟是多选下拉框,不能是单个int或者string。如果之前是单个值,先把Model里的这个属性改过来,不然表单提交后模型绑定都不会正确。

2. 修改Multiselect初始化脚本,添加选中值回显

你需要在初始化multiselect的时候,通过selectedValues参数把Model里已选中的值传进去。修改你的脚本如下:

$(function () {
    // 把服务器端Model的选中值转成客户端可识别的JS数组
    var selectedKveds = @Html.Raw(Json.Serialize(Model.KvedFilter));

    $('[id*=dropDownKved]').multiselect({
        includeSelectAllOption: false,
        numberDisplayed: 1,
        buttonWidth: '100%',
        // 关键:设置初始化时要选中的项
        selectedValues: selectedKveds,
        onChange: function (element, checked) {
            // 修正onChange里获取选中值的逻辑,之前的写法有问题
            var selected = $('[id*=dropDownKved]').find('option:selected').map(function() {
                return $(this).val();
            }).get();
            
            console.log(selected);
        }
    });
});

这里用@Html.Raw(Json.Serialize(Model.KvedFilter))把服务器端的Model值转换成客户端的JS数组,这样multiselect初始化时就会自动匹配并选中这些值。

3. 验证Controller端的模型绑定逻辑

确保你的Controller接收参数的Action里,参数的KvedFilter是和Model一致的可枚举类型,比如:

public ActionResult YourFilterAction(YourViewModel model)
{
    // 这里model.KvedFilter应该能拿到用户选中的所有值
    // 处理你的数据库筛选逻辑...
    
    // 记得重新赋值ViewBag.KvedsFilter,刷新页面后需要重新生成下拉选项
    ViewBag.KvedsFilter = GetKvedOptionsFromDb();
    
    return View(model);
}

这样当页面刷新(比如提交表单后返回同一个视图),Model里的KvedFilter保存着用户之前选中的值,初始化multiselect时就会自动把这些值选中。

为什么原来的代码不行?

原来的脚本只是在用户手动改变选中状态时打印值,但没有在页面加载时读取Model里已有的选中值,所以刷新后multiselect还是默认的未选中状态。加上selectedValues参数后,控件初始化时就会同步Model里的选中状态了。

内容的提问来源于stack exchange,提问作者Ihor Mykytiv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:01:49