You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发送Post请求时遇ViewData错误:无'MessageCategoryID'对应的IEnumerable<SelectListItem>

问题解决:Post请求时DropDownListFor找不到ViewData项

错误原因

你仅在Index的GET请求方法中填充了下拉选项的ViewBag数据,但POST请求提交后(比如Model验证失败需要返回视图时),未重新填充该ViewBag,导致DropDownListFor找不到对应选项集合,触发错误。

解决方案

  1. 将填充下拉选项的逻辑抽为独立方法,避免重复代码
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:12:58