ASP.NET CORE MVC 租车项目新增预订出现ArgumentNullException items为空报错如何解决
错误根因
ArgumentNullException: Value cannot be null. (Parameter 'items') 是ASP.NET Core MVC渲染Select下拉控件时,传入的下拉选项集合为null导致的,你要自动填充客户名称、选中车辆的场景下,大概率是提交请求/跳转预订页时没有给视图传递对应的下拉数据源,或者传递过程中数据源被置空了。
分步解决方案
检查预订页Action的数据源传递逻辑
点击预订按钮跳转的Action中,必须同时初始化3类数据:当前登录用户的客户信息、选中的车辆信息、以及下拉框需要的选项集合。示例代码参考:
public IActionResult CreateReservation(int vehicleId) { // 1. 初始化车辆下拉选项(即使默认选中当前车辆,也要给完整的items集合) var vehicles = _context.Vehicles.Select(v=>new SelectListItem { Text = v.Brand + " " + v.Model, Value = v.Id.ToString(), Selected = v.Id == vehicleId // 自动选中点击的车辆 }).ToList(); // 2. 初始化客户下拉选项 var currentUserId = User.FindFirstValue(ClaimTypes.NameIdentifier); var customers = _context.Customers.Select(c=>new SelectListItem { Text = c.CustomerName, Value = c.Id.ToString(), Selected = c.UserId == currentUserId // 自动选中当前登录用户对应的客户 }).ToList(); // 3. 给视图模型赋值,*不要漏掉两个下拉集合的赋值* var reservationVM = new ReservationCreateVM { VehicleId = vehicleId, CustomerId = int.Parse(currentUserId), VehicleOptions = vehicles, // 必须赋值,不能留null CustomerOptions = customers // 必须赋值,不能留null }; return View(reservationVM); }注意:哪怕你要下拉框默认只展示选中的那一条,也要给完整的
SelectListItem集合,不能只给选中的值不给items。检查视图中Select控件的绑定写法
视图中绑定下拉框时,要确保
asp-items绑定的是你传递的集合属性,不要写错属性名,也不要直接赋值为null。示例写法:<!-- 客户名称下拉框 --> <select asp-for="CustomerId" asp-items="Model.CustomerOptions" class="form-control"></select> <!-- 选中车辆下拉框 --> <select asp-for="VehicleId" asp-items="Model.VehicleOptions" class="form-control"></select>如果你用了
ViewData/ViewBag传递下拉集合,要确保key拼写完全一致,且返回页面前已经赋值:// 控制器中赋值 ViewBag.VehicleOptions = vehicles; // 视图中绑定,注意转换类型,避免null <select asp-for="VehicleId" asp-items="@(ViewBag.VehicleOptions as IEnumerable<SelectListItem>)" ></select>处理表单提交失败回传的场景
如果用户填写表单后验证失败回显页面,你需要在Post的Action中重新给下拉集合赋值,否则返回视图时集合会变成null触发同样错误:
[HttpPost] public IActionResult CreateReservation(ReservationCreateVM model) { if(!ModelState.IsValid) { // 回显前必须重新给下拉集合赋值 model.VehicleOptions = _context.Vehicles.Select(v=>new SelectListItem{/* 省略赋值逻辑 */}).ToList(); model.CustomerOptions = _context.Customers.Select(c=>new SelectListItem{/* 省略赋值逻辑 */}).ToList(); return View(model); } // 保存预订逻辑 return RedirectToAction("Index"); }可选兜底处理
可以在视图模型的构造函数中给下拉集合初始化空列表,避免极端场景下的null问题:
public class ReservationCreateVM { public ReservationCreateVM() { VehicleOptions = new List<SelectListItem>(); CustomerOptions = new List<SelectListItem>(); } public int VehicleId { get; set; } public int CustomerId { get; set; } public List<SelectListItem> VehicleOptions { get; set; } public List<SelectListItem> CustomerOptions { get; set; } // 其他预订字段 }
内容的提问来源于stack exchange,提问作者AlexNorth
相关产品推荐
相关产品推荐

