.NET Core 6 MVC下拉菜单选择无法过滤数据问题咨询
问题解决方案
核心问题根源
你遇到的问题本质是三个环节的疏漏:ViewModel未保留选中的下拉值、查询逻辑未正确应用筛选参数、视图下拉框未绑定选中状态。
具体修改步骤
1. 修正控制器Action的逻辑与ViewModel赋值
在Index方法中,必须将选中的筛选参数回写进ViewModel,同时基于参数过滤数据:
public IActionResult Index(string String02NameSelected) { var viewModel = new YourViewModel(); // 保留选中的下拉值,默认设为"All" viewModel.String02NameSelected = String02NameSelected ?? "All"; // 构建带过滤的查询 var dataQuery = _context.YourModel.AsQueryable(); if (!string.IsNullOrEmpty(viewModel.String02NameSelected) && viewModel.String02NameSelected != "All") { dataQuery = dataQuery.Where(m => m.String02Name == viewModel.String02NameSelected); } viewModel.YourDataList = dataQuery.ToList(); // 生成下拉选项列表(从数据中取不重复值) viewModel.String02Options = _context.YourModel .Select(m => m.String02Name) .Distinct() .OrderBy(n => n) .ToList(); return View(viewModel); }
2. 视图中绑定下拉框的选中状态
用Tag Helper或手动判断的方式,确保回传后下拉框显示选中的选项:
方式一:使用ASP.NET Core Tag Helper(推荐)
<select asp-for="String02NameSelected" asp-items="@(new SelectList(Model.String02Options))"> <option value="All">All</option> </select>
方式二:手动判断选中状态
<select name="String02NameSelected"> <option value="All" @(Model.String02NameSelected == "All" ? "selected" : "")>All</option> @foreach (var option in Model.String02Options) { <option value="@option" @(Model.String02NameSelected == option ? "selected" : "")>@option</option> } </select>
3. 确认ViewModel的字段完整性
确保ViewModel包含必要的三个字段:
public class YourViewModel { // 存储选中的下拉值 public string String02NameSelected { get; set; } // 下拉选项列表 public List<string> String02Options { get; set; } // 展示的过滤后数据 public List<YourModel> YourDataList { get; set; } }
额外注意事项
- 若使用POST提交表单,建议采用PRG模式(POST-REDIRECT-GET),提交后重定向到带筛选参数的GET请求,避免刷新页面重复提交。
- 检查过滤逻辑中的字段名,确保与Model中的字段完全匹配(比如不要将
String02Name误写为String02)。
内容的提问来源于stack exchange,提问作者3v3rhart
相关产品推荐
相关产品推荐

