Ajax向Razor Pages传多JSON对象时后端Model为null的问题
问题分析与解决
你的后端Model始终为null,核心是模型类名称不匹配、属性名不匹配、数据类型不匹配这三个问题导致的,具体修正方案如下:
1. 模型类名称不匹配
后端Action接收的参数类型是All_Obj,但你定义的模型类名为model,名称完全不一致,无法完成映射。需要将模型类名称改为All_Obj:
// 修正后的模型类 public class All_Obj { public Item_1 field_1 { get; set; } public Item_2 field_2 { get; set; } } public class Item_1 { public string field_item_1_1 { get; set; } public string field_item_1_2 { get; set; } public string field_item_1_3 { get; set; } } public class Item_2 { public string field_item_2_1 { get; set; } public string field_item_2_2 { get; set; } public string field_item_2_3 { get; set; } }
2. 前后端属性名不匹配
前端构造的model属性是Item_1/Item_2,但后端模型类的属性是field_1/field_2,JSON序列化时无法对应,需统一两边的属性名:
- 方案一:修改前端属性名,和后端一致
// 修正后的前端model构造 var model = { field_1: obj_A, // 对应后端field_1 field_2: obj_B // 对应后端field_2 };
- 方案二:给后端属性加特性,指定前端传递的属性名
using Newtonsoft.Json; public class All_Obj { [JsonProperty("Item_1")] public Item_1 field_1 { get; set; } [JsonProperty("Item_2")] public Item_2 field_2 { get; set; } }
3. 数据类型不匹配
前端的Obj_A是数组类型(通过push把单个对象放进了数组),但后端模型类的field_1是单个Item_1对象,类型不兼容导致解析失败,需将前端的数组改为单个对象:
// 修正后的Obj_A构建逻辑 var obj_A = {}; // 直接定义为对象,而非数组 var inputs = $("#fieldset1 input[name^=show_all_]"); for(var i = 0; i < inputs.length; i++){ var text_id = $(inputs[i]).attr("id").replace('show_all_',''); var value = $(inputs[i]).val(); obj_A[text_id]=value; } // Obj_B同理,直接构建为单个对象 // 最终构造model var model = { Item_1: obj_A, Item_2: obj_B };
额外检查项
- 确保前端生成的
text_id与后端Item_1/Item_2的属性名完全一致(大小写敏感); - 确认
__RequestVerificationToken的选择器正确,Razor页面默认会生成该token,需保证能正常获取。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

