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

Asp.Net Core下拉框类型不匹配报错求助,更新模型后问题仍存在

解决InvalidOperationException: ViewData项类型不匹配问题

问题核心

错误的本质是:@Html.DropDownListFor 试图从ViewData中获取键为Mission.Id的数据源,但此时该键对应的是一个Guid值(来自模型导航属性Mission.Id),而非预期的IEnumerable<SelectListItem>类型。当页面回传或模型验证失败时,ModelState会优先覆盖ViewData中同名的键,导致数据源类型不匹配。

修复步骤

1. 更新视图(CSHTML)代码

将下拉框的绑定目标从导航属性的Mission.Id改为模型中新增的外键字段MissionId,同时调整标签和验证的对应字段:

<div class="form-group">
    <label asp-for="MissionId" class="control-label"></label>
    @Html.DropDownListFor(model => model.MissionId, (SelectList)ViewBag.Mission, htmlAttributes: new { @class = "form-control"})
    <span asp-validation-for="MissionId" class="text-danger"></span>
</div>
<div class="form-group">
    <label asp-for="QrId" class="control-label"></label>
    @Html.DropDownListFor(model => model.QrId, (SelectList)ViewBag.Qr, htmlAttributes: new { @class = "form-control"})
    <span asp-validation-for="QrId" class="text-danger"></span>
</div>

2. 补全Post方法的ViewBag重填逻辑

如果你的Create有对应的Post方法,在模型验证失败返回视图时,必须重新设置ViewBag.Mission和ViewBag.Qr,否则会出现数据源缺失的问题:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(DefinedMissionPath definedMissionPath)
{
    if (!ModelState.IsValid)
    {
        // 重新填充下拉框数据源
        ViewBag.Mission = new SelectList(_context.DefinedMissionContext, "Id", "Name");
        ViewBag.Qr = new SelectList(_context.QRContext, "Id", "Name");
        return View(definedMissionPath);
    }
    
    _context.Add(definedMissionPath);
    await _context.SaveChangesAsync();
    return RedirectToAction(nameof(Index));
}

关键说明

  • 直接绑定外键字段(MissionId/QrId)而非导航属性的Id,可避免ViewData键名与模型属性名冲突的问题。
  • 模型验证失败返回视图时,必须重新初始化下拉框的SelectList,因为ViewBag的数据不会在回传时保留。

内容的提问来源于stack exchange,提问作者Abdullah Ali GÜN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:38:09