Asp.net Core 6 MVC视图传对象列表到控制器为空求助
排查AJAX传参控制器接收为空的问题
以下是针对你的代码的具体排查和修复方案:
1. 控制器参数添加[FromBody]特性
ASP.NET Core默认不会自动从请求体的JSON中绑定复杂对象,必须显式添加[FromBody]特性,告诉框架从JSON请求体读取数据:
[HttpPost] // 确保标记为POST请求 public JsonResult SaveOrderw([FromBody] POHeaderViewModel objPOHeaderViewModel) { return Json(data: "Successfully added."); }
2. 初始化模型中的集合属性
你的POHeaderViewModel里的Polines是List<POLineViewModel>,没有默认初始化,绑定框架无法自动创建集合实例,会导致绑定失败。修改模型类:
public class POHeaderViewModel { // 其他属性保持不变 public List<POLineViewModel> Polines { get; set; } = new List<POLineViewModel>(); // 添加默认初始化 }
3. 修正JavaScript中明细行的字段取值错误
你当前代码里,POLineViewModel的Rate、Qty、Disc、SubTotal都从同一个td:eq(7)取值,这会导致所有数值字段取到相同值,若单元格内容非数字,parseFloat会返回NaN,而decimal类型无法绑定NaN,最终导致整个模型绑定失败。
假设表格各字段对应不同列索引,修正后的循环代码:
$('#tblPOLine').find('tr:gt(0)').each(function () { var POLineViewModel = {}; POLineViewModel.ItmId = $(this).find('td:eq(2)').text().trim(); // 去除空格避免空值问题 POLineViewModel.Code = $(this).find('td:eq(2)').text().trim(); POLineViewModel.UOM = $(this).find('td:eq(3)').text().trim(); POLineViewModel.Rate = parseFloat($(this).find('td:eq(5)').text()) || 0; // 空值时默认设为0 POLineViewModel.Qty = parseFloat($(this).find('td:eq(4)').text()) || 0; POLineViewModel.Disc = parseFloat($(this).find('td:eq(6)').text()) || 0; POLineViewModel.SubTotal = parseFloat($(this).find('td:eq(7)').text()) || 0; ListofPOLineViewModel.push(POLineViewModel); });
4. 清理AJAX请求中的重复配置
你的AJAX代码重复写了两次contentType,建议保留一次标准配置:
$.ajax({ async: true, type: 'POST', contentType: "application/json; charset=utf-8", data: JSON.stringify(objPOHeaderViewModel), dataType: "json", url: '/PONew/SaveOrderw', success: function (data) { alert(data); }, error: function (xhr) { console.log(xhr.responseText); // 打印错误详情辅助排查 alert("Error occurred."); } });
5. 验证请求数据格式
在JSON.stringify之前打印对象结构,确认数据是否正确:
console.log(objPOHeaderViewModel); // 检查字段和对应值是否符合预期
完成以上修改后,重新测试,控制器即可正常接收参数。
内容的提问来源于stack exchange,提问作者Hibir
相关产品推荐
相关产品推荐

