发送Post请求时遇ViewData错误:无'MessageCategoryID'对应的IEnumerable<SelectListItem>
问题解决:Post请求时DropDownListFor找不到ViewData项
错误原因
你仅在Index的GET请求方法中填充了下拉选项的ViewBag数据,但POST请求提交后(比如Model验证失败需要返回视图时),未重新填充该ViewBag,导致DropDownListFor找不到对应选项集合,触发错误。
解决方案
- 将填充下拉选项的逻辑抽为独立方法,避免重复代码
- 在GET和POST方法中都调用该方法,确保返回视图时下拉选项数据始终存在
修改后的控制器代码
public async Task<IActionResult> Index() { await PopulateMessageCategories(); return View(); } // 处理Post请求的方法(请根据实际方法名调整) [HttpPost] public async Task<IActionResult> Index(YourViewModel model) { if (ModelState.IsValid) { // 执行数据库添加逻辑 return RedirectToAction("Success"); } // 验证失败时重新填充下拉选项 await PopulateMessageCategories(); return View(model); } // 独立的下拉选项填充方法 private async Task PopulateMessageCategories() { var client = _httpClientFactory.CreateClient(); var responseMessage = await client.GetAsync("http://localhost:5173/api/MessageCategory"); var jsonData = await responseMessage.Content.ReadAsStringAsync(); var values = JsonConvert.DeserializeObject<List<ResultMessageCategoryDto>>(jsonData); List<SelectListItem> categoryItems = values.Select(x => new SelectListItem { Text = x.MessageCategoryName, Value = x.MessageCategoryID.ToString() }).ToList(); ViewBag.MessageCategoryOptions = categoryItems; }
修改后的视图代码
@Html.DropDownListFor(x => x.MessageCategoryID, (List<SelectListItem>)ViewBag.MessageCategoryOptions, "请选择分类", new {@class = "form-control"})
额外建议
- 使用命名更清晰的
ViewBag键(如MessageCategoryOptions),避免混淆 - 优先考虑用ViewModel封装下拉选项数据,替代
ViewBag以获得更安全的类型检查
内容的提问来源于stack exchange,提问作者Murad Mextiev
相关产品推荐
相关产品推荐

