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

ASP.Net Core MVC表单提交模型绑定Null值及跳转异常问题

问题分析与解决方案

看起来你遇到了两个典型的ASP.NET Core模型绑定+AJAX交互问题,咱们一步步拆解解决:

一、ShoppingCart所有属性为Null的核心原因及修复

首先你的控制器方法存在冲突的配置,这是导致绑定失败的关键:

  • [FromForm] 告诉ASP.NET Core从表单数据中绑定模型
  • [Consumes("application/json")] 却强制要求请求只能是JSON格式

这两个配置互相矛盾,服务器根本不知道该怎么解析你的请求,自然就把ShoppingCart的所有属性设为Null了。

修复步骤:

  1. 调整控制器的模型绑定方式:把[FromForm]换成[FromBody],这样服务器才能正确解析你通过AJAX发送的JSON请求体。同时,因为AJAX不需要服务器返回重定向页面,咱们把返回值改成Ok()更合适:
[HttpPost] 
[Consumes("application/json")] 
public async Task<IActionResult> Save([FromBody] ShoppingCart s) { 
    await _db.ShoppingCarts.AddAsync(s); 
    await _db.SaveChangesAsync(); 
    return Ok(); // 返回成功状态即可,跳转交给前端处理
}
  1. 阻止按钮的默认表单提交行为:你的按钮是type="submit",点击时会同时触发AJAX请求和原生表单提交,这会造成请求混乱。在JS的点击事件里加上e.preventDefault(),只保留AJAX逻辑:
orderB.addEventListener("click", function (e) { 
    e.preventDefault(); // 阻止表单默认提交,避免重复请求
    // 下面的原有代码不变...
})

二、无法自动跳转到ThankYou页面的修复

当用AJAX发送异步请求时,服务器返回的RedirectToAction不会自动让浏览器跳转——因为AJAX请求是在后台完成的,浏览器不会主动处理它的重定向响应。咱们需要在AJAX的成功回调里手动触发页面跳转:

修改你的AJAX代码,添加success回调函数:

$.ajax({ 
    type: "POST", 
    data: JSON.stringify(shoppingCart), 
    url: "senditems/save", 
    contentType: "application/json;charset=utf-8", 
    success: function() {
        // 请求成功后,手动跳转到感谢页面
        window.location.href = "/ThankYou/Index";
    },
    error: function() {
        // 可选:添加错误提示,提升用户体验
        alert("订单提交失败,请稍后重试");
    }
})

额外优化建议

  • 你的ShoppingCart类的id是可空int类型且标记为[Key],如果这是数据库自增主键,完全不需要前端传入,可以删掉前端的idClient隐藏输入框,避免传入空值干扰数据库自动生成ID。
  • Product类的quantity用string类型存储不太合理,建议改成int类型,既符合业务逻辑,后续做库存计算或统计也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:42:50