如何在页面刷新后保留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
相关产品推荐
相关产品推荐

