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

ASP.NET Core MVC值绑定异常:Query提交后值不显示

问题原因及解决方案

这个问题的核心是ASP.NET Core在处理POST请求后返回视图时,会优先使用ModelState中的值(即表单提交的原始数据),而非你传入的模型对象的属性值。

具体到你的场景:

  • 点击Query页面的查询按钮时,发起的是POST请求,表单里的WorkNum输入框为空(因为是readonly且未输入内容),所以ModelState中会存入一个键为WorkNum、值为空的条目。
  • 当你返回Index视图并传入StaffInfoModel时,视图渲染asp-for="workNum"的输入框时,框架会优先检查ModelState。由于.NET模型绑定不区分大小写,WorkNum和workNum会被视为同一个键,因此会使用ModelState里的空值,覆盖你在模型中设置的"1010101010"。
  • 而点击Privacy菜单是发起GET请求,没有表单数据提交,ModelState为空,所以框架直接使用你传入的模型属性值,因此能正常显示。

解决办法

方法1:清除ModelState(适合简单场景)

在POST的Query动作中,返回视图前清除ModelState,让框架使用你传入的模型值:

[HttpPost]
public IActionResult Query(QueryInfoModel model)
{
    StaffInfoModel staff = new StaffInfoModel();
    staff.workNum = "1010101010";

    Debug.WriteLine(staff.workNum);
    ModelState.Clear(); // 清除ModelState,避免覆盖模型值
    return View("Index", staff);
}

方法2:使用PRG模式(Post-Redirect-Get,推荐的最佳实践)

PRG模式可以避免表单重复提交,同时也能解决ModelState的问题:

  1. 在POST动作中,将需要传递的值存入TempData,然后重定向到GET动作:
[HttpPost]
public IActionResult Query(QueryInfoModel model)
{
    TempData["WorkNum"] = "1010101010";
    return RedirectToAction("Index");
}
  1. 修改Index动作,从TempData中取出值并传入模型:
public IActionResult Index()
{
    StaffInfoModel staff = new StaffInfoModel();
    if (TempData.ContainsKey("WorkNum"))
    {
        staff.workNum = TempData["WorkNum"].ToString();
    }
    return View(staff);
}

方法3:明确指定输入框的值(绕过ModelState)

在Index.cshtml的输入框中,直接指定value属性,强制使用模型的值:

<input type="text" asp-for="workNum" class="form-control col-sm-4" readonly="readonly" value="@Model.workNum" />

注意:这种方法会完全绕过ModelState的验证和值优先规则,适合不需要验证的场景。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:15:16