ASP.NET MVC 下拉框提交筛选表格无结果问题排查
问题根因
筛选后表格为空是核心逻辑不匹配导致的:
你给下拉框选项赋值时,存储的提交值是ModeID的数字字符串,但后端筛选逻辑中,却用提交上来的值和ModeName(字符串类型的模式名)做相等判断,两个值完全不匹配,自然查不到任何对应数据。
除此之外还有三个潜在问题:
- 直接调用
db.Game.ToList()会全表加载游戏数据,如果没有开启Entity Framework延迟加载,Game实体的Modes导航属性为null,比对时会触发空引用异常,直接返回空结果。 - 提交后下拉框不会保留当前选中的选项,用户体验有问题。
- 视图里游戏名称输出多写了一个多余的右括号,属于笔误。
修复方案
推荐使用ID关联查询的方案(性能更好、不会因为模式名重复出现筛选错误),修改步骤如下:
- 首先在Controller顶部引入EF的命名空间,用于支持预加载功能:
using System.Data.Entity;
- 修改Controller的Index action逻辑,预加载导航属性、修正筛选匹配规则、保留下拉选中状态:
public class TestController: Controller { private readonly GameContext db = new GameContext(); // GET: Test public ActionResult Index(string selectedMode = "") { var vm = new TestViewModel(); // 构造下拉选项,提交值为ModeID List<SelectListItem> deger1 = (from i in db.Mode.ToList() select new SelectListItem { Text = i.ModeName, Value = i.ModeID.ToString(), // 提交后保持选中状态 Selected = selectedMode == i.ModeID.ToString() }).ToList(); ViewBag.dgr1 = deger1; // 预加载Modes导航属性,避免空引用,延迟生成SQL减少不必要的数据查询 var data = db.Game.Include(g => g.Modes).AsQueryable(); if (!string.IsNullOrEmpty(selectedMode)) { // 提交值是ModeID的字符串,转成整型后和ModeID匹配 int targetModeId = int.Parse(selectedMode); data = data.Where(x => x.Modes.ModeID == targetModeId); } vm.Data = data.ToList(); vm.SelectedMode = selectedMode; return View(vm); } }
- 修正Index.cshtml里的笔误,去掉
@item.GameName后面多余的右括号:
@model nproject.Models.TestViewModel @using (Html.BeginForm("Index", "Test", FormMethod.Get)) { <label> Select a mode</label> @Html.DropDownListFor(f => f.SelectedMode, (List<SelectListItem>)ViewBag.dgr1, "Select") <input type="submit" value="Filter" /> } <table> <tr> <th>games</th> </tr> @foreach (var item in Model.Data) { <tr> <td>@item.GameName</td> </tr> } </table>
如果你确实需要通过模式名称筛选,只需要修改两处:
- 构造下拉选项时,把
Value = i.ModeID.ToString()改成Value = i.ModeName - 去掉筛选逻辑里的ID转换步骤,直接使用
data = data.Where(x=>x.Modes.ModeName == selectedMode);即可,注意这种方式需要保证ModeName全局唯一,否则会出现筛选结果错误。
内容的提问来源于stack exchange,提问作者Heidelbergensis
相关产品推荐
相关产品推荐

