ASP.NET MVC控制器向视图传递筛选列表时遇空引用异常
问题解决方法
空引用异常的核心原因是SelectList指定的字段名与ViewModel的属性不匹配,同时查询逻辑可以优化提升性能,具体修正如下:
1. 修正SelectList的字段映射
你创建的BundleNodeViewModel属性是StudyId和StudyName,但初始化SelectList时却用了"Id"和"Name",系统找不到对应属性就会抛出空引用异常。修改为:
ViewBag.studyList = new SelectList(studies.OrderBy(p => p.StudyName), "StudyId", "StudyName");
2. 优化查询逻辑(可选但推荐)
原查询中把子查询提前ToList()会导致先加载所有匹配的StudyId到内存,再做Contains判断,性能较差。可以用Any()替代,让EF直接生成更高效的SQL:
var studies = (from t in _context.Studies where !_context.StudyNodes.Any(sn => sn.NodeId == id && sn.StudyId == t.Id) select new BundleNodeViewModel { StudyId = t.Id, StudyName = t.Name }).ToList();
3. 确认ViewModel定义
确保BundleNodeViewModel正确定义了对应属性,避免属性名拼写错误:
public class BundleNodeViewModel { public int StudyId { get; set; } public string StudyName { get; set; } }
视图端验证(补充)
如果视图中使用DropDownList或类似控件,确认绑定的是ViewBag.studyList,例如:
@Html.DropDownList("StudyId", (SelectList)ViewBag.studyList, "请选择", new { @class = "form-control" })
内容的提问来源于stack exchange,提问作者A Cameron
相关产品推荐
相关产品推荐

