ASP.Net Core MVC表单提交模型绑定Null值及跳转异常问题
问题分析与解决方案
看起来你遇到了两个典型的ASP.NET Core模型绑定+AJAX交互问题,咱们一步步拆解解决:
一、ShoppingCart所有属性为Null的核心原因及修复
首先你的控制器方法存在冲突的配置,这是导致绑定失败的关键:
[FromForm]告诉ASP.NET Core从表单数据中绑定模型[Consumes("application/json")]却强制要求请求只能是JSON格式
这两个配置互相矛盾,服务器根本不知道该怎么解析你的请求,自然就把ShoppingCart的所有属性设为Null了。
修复步骤:
- 调整控制器的模型绑定方式:把
[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(); // 返回成功状态即可,跳转交给前端处理 }
- 阻止按钮的默认表单提交行为:你的按钮是
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
相关产品推荐
相关产品推荐

