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

ASP.NET MVC 下拉框提交筛选表格无结果问题排查

问题根因

筛选后表格为空是核心逻辑不匹配导致的:
你给下拉框选项赋值时,存储的提交值是ModeID的数字字符串,但后端筛选逻辑中,却用提交上来的值和ModeName(字符串类型的模式名)做相等判断,两个值完全不匹配,自然查不到任何对应数据。
除此之外还有三个潜在问题:

  • 直接调用db.Game.ToList()会全表加载游戏数据,如果没有开启Entity Framework延迟加载,Game实体的Modes导航属性为null,比对时会触发空引用异常,直接返回空结果。
  • 提交后下拉框不会保留当前选中的选项,用户体验有问题。
  • 视图里游戏名称输出多写了一个多余的右括号,属于笔误。
修复方案

推荐使用ID关联查询的方案(性能更好、不会因为模式名重复出现筛选错误),修改步骤如下:

  1. 首先在Controller顶部引入EF的命名空间,用于支持预加载功能:
using System.Data.Entity;
  1. 修改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);
    }
}
  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:18:12