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

提交汽车预订时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:27:32