提交汽车预订时出现ViewData缺失PricingID枚举项错误求助
问题解决思路
核心原因
错误本质是表单提交后ModelState验证失败,控制器返回视图时未重新向ViewData/ViewBag填充PricingID对应的下拉列表数据源。Swagger能正常提交是因为它直接调用API接口,无需渲染前端视图;而MVC视图渲染下拉框(如Html.DropDownListFor)时,必须依赖ViewData中对应键的IEnumerable<SelectListItem>类型数据。
解决方案
1. 重构下拉列表数据源填充逻辑
把填充PricingID下拉列表的代码抽成独立方法,在GET请求初始化视图、POST请求验证失败返回视图时都调用:
// 独立方法:填充定价选项数据源 private void PopulatePricingOptions() { var pricingOptions = _dbContext.Pricings.Select(p => new SelectListItem { Value = p.Id.ToString(), Text = p.Name }).ToList(); ViewData["PricingID"] = pricingOptions; } // GET请求:初始化视图时填充数据源 public IActionResult Index() { PopulatePricingOptions(); return View(); } // POST请求:验证失败时重新填充数据源再返回视图 [HttpPost] public IActionResult Index(CarBookingViewModel model) { if (!ModelState.IsValid) { PopulatePricingOptions(); return View(model); } // 正常提交逻辑 _dbContext.CarBookings.Add(model); _dbContext.SaveChanges(); return RedirectToAction("Success"); }
2. 检查视图下拉框渲染代码
确保视图中下拉框辅助方法正确关联ViewData键,示例如下:
@model CarBookingViewModel <div class="form-group"> @Html.LabelFor(m => m.PricingID) @Html.DropDownListFor(m => m.PricingID, (IEnumerable<SelectListItem>)ViewData["PricingID"], "请选择定价方案", new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.PricingID) </div>
3. 额外注意事项
- 禁止依赖客户端提交的下拉框值重新渲染视图,必须从后端重新获取数据源,避免安全风险与数据不一致。
- 若使用ViewBag替代ViewData,需保证键名完全一致(如
ViewBag.PricingID对应视图中的ViewBag.PricingID)。
内容的提问来源于stack exchange,提问作者Oğuzhan
相关产品推荐
相关产品推荐

