ASP.NET MVC 5使用下拉框创建数据库记录触发ArgumentNullException报错
问题根因
你遇到的ArgumentNullException: Value cannot be null. (Parameter 'items')报错,本质是实例化SelectList时传入的数据源ViewBag.statusTypeList为空值。编辑功能正常是因为编辑页的GET请求后台已经给ViewBag.statusTypeList做了赋值,而新增功能对应的Action漏了赋值逻辑。
解决步骤
- 第一步:给
Create的GET请求Action添加ViewBag.statusTypeList赋值逻辑,代码示例如下:
public IActionResult Create() { // 其他业务逻辑 List<SpeakerStatusLookupModel> statusTypeList = _context.SpeakerStatusLookupModel.ToList(); statusTypeList.Insert(0, new SpeakerStatusLookupModel { Id = 0, SpeakerStatus = "Select" }); ViewBag.statusTypeList = statusTypeList; return View(); }
- 第二步:给
Create的POST请求Action也补充赋值逻辑,防止模型验证失败返回视图时再次触发空值报错:
[HttpPost] [ValidateAntiForgeryToken] public IActionResult Create(SpeakerQuery model) { if(ModelState.IsValid) { // 保存数据的业务逻辑 return RedirectToAction(nameof(Index)); } // 验证失败返回页面前重新给下拉列表赋值 List<SpeakerStatusLookupModel> statusTypeList = _context.SpeakerStatusLookupModel.ToList(); statusTypeList.Insert(0, new SpeakerStatusLookupModel { Id = 0, SpeakerStatus = "Select" }); ViewBag.statusTypeList = statusTypeList; return View(model); }
可选优化方案
- 视图层增加空值兼容逻辑,避免偶发空值导致页面崩溃:
<select asp-for="SpeakerStatus" class="control-label" asp-items="@(ViewBag.statusTypeList != null ? new SelectList(ViewBag.statusTypeList, "Id", "SpeakerStatus") : Enumerable.Empty<SelectListItem>())"></select>
- 推荐改用强类型ViewModel传递下拉列表数据,替代ViewBag,可从编码阶段就避免漏赋值的问题,也能获得智能提示支持。
- 给
SpeakerQuery类的SpeakerStatus属性添加[Required]验证注解,避免用户未选择下拉项就提交导致数据异常。
内容的提问来源于stack exchange,提问作者Michael Easterbrook
相关产品推荐
相关产品推荐

