为什么通过AJAX传递到.NET Core控制器的所有数值都为0而非输入值?
问题修复方案
1. 修复AJAX语法错误
你当前JS代码存在两处低级语法问题:
- 重复声明了
success回调,后声明的会覆盖前者,导致原有DOM更新逻辑不执行 beforesend大小写错误,正确写法为beforeSend(S大写)
修正后的JS代码如下:
$(document).ready(function() { $("#calculate_btn").click(function() { // 先打印取值确认前端能拿到正确输入 console.log('product_no:', $("#controller_pro_no").val()); console.log('insured_pro:', $("#controller_ins").val()); console.log('pro_durate_m:', $("#controller_pro_durate_m").val()); $.ajax({ type: "Post", url: '@Url.Action("mylist","users")', data: JSON.stringify({ values: { // 外层加values对应后端cost_info参数名 product_no: $("#controller_pro_no").val(), insured_pro: $("#controller_ins").val(), pro_durate_m: $("#controller_pro_durate_m").val(), }, u: {} // 预留user参数位置 }), contentType: "application/json; charset=utf-8", dataType: "json", processData: false, success: function(mdata) { $("#fade1").hide(); $("#modal").hide(); $("#calculated_param").css('display', 'block'); for (var n in mdata) { $("#product_index").text(JSON.stringify(n.product_index)); $("#income_sell_pr_fertilizer").text(JSON.stringify(n.income_sell_pr_fertilizer)); $("#net_profit_all").text(JSON.stringify(n.net_profit_all)); } }, beforeSend: function() { $("#fade1").show(); $("#modal").show(); }, }); }); });
2. 修复后端参数绑定逻辑
.NET Core 接收application/json类型的POST请求时,默认只能有一个参数标记[FromBody],且请求JSON结构必须和接收模型完全匹配,否则会绑定失败取默认值0。
步骤1:新增统一接收视图模型
public class MyListRequest { public cost_info values { get; set; } public user u { get; set; } }
步骤2:修正控制器Action代码
注意修复拼写错误JasonRequestBehavoir→JsonRequestBehavior,并加[FromBody]标记:
[HttpPost] public IActionResult mylist([FromBody] MyListRequest request) { blmodel bluser = new blmodel(); request.u.username = Request.Cookies["username"]; var para = bluser.mylist(request.values, request.u); return Json(para, JsonRequestBehavior.AllowGet); }
3. 补充检查项
- 确认HTML中存在id为
controller_ins、controller_pro_durate_m的输入框,否则取值为空绑定到数值类型会默认是0 - 确认
cost_info类的属性名和前端传递的三个属性名完全一致,且属性为可写的public属性
内容的提问来源于stack exchange,提问作者Hamed Zahiri
相关产品推荐
相关产品推荐

