.NET Core中Ajax传大量对象列表至控制器时接收为Null的问题
.NET Core Ajax传大量对象列表时控制器接收为Null的解决方向
以下是针对你遇到问题的几个排查和解决方向:
1. 调整请求大小限制
ASP.NET Core默认对POST表单数据的大小有限制,当数据量超过阈值时会被截断,直接导致模型绑定失败,接收的列表为Null。
局部配置(针对单个Action):在目标Action上添加
[RequestSizeLimit]特性,设置合适的大小(示例为10MB):[HttpPost] [RequestSizeLimit(10485760)] // 10MB,可根据实际数据量调整 public IActionResult LoadCalendar(List<CalendarListViewModel> calendarList) { // 业务逻辑代码 }全局配置(适用于所有请求):在
Program.cs中配置FormOptions,放宽长度和计数限制:builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 10485760; // 10MB options.ValueLengthLimit = int.MaxValue; options.ValueCountLimit = int.MaxValue; });
2. 改用JSON格式发送请求
当前Ajax以默认表单编码格式发送大量数据,容易出现解析问题。改为JSON格式传输更稳定:
修改Ajax配置,指定
contentType并序列化数据:function LoadCalendarForDesktop(pageNumber, pageSize, calendarList, pageCounter) { $.ajax({ type: 'POST', url: '@Url.Action("LoadCalendar", "LPProductManagement")', data: JSON.stringify({ calendarList: calendarList }), contentType: "application/json", cache: false, async: false, success: function (data) { // 成功回调逻辑 } }); }控制器Action添加
[FromBody]特性,确保从请求体读取JSON数据:// 推荐使用包装类接收,避免直接传列表的绑定问题 public class CalendarRequest { public List<CalendarListViewModel> CalendarList { get; set; } } [HttpPost] public IActionResult LoadCalendar([FromBody] CalendarRequest request) { var calendarList = request.CalendarList; // 业务逻辑 }
3. 排查JSON序列化/反序列化问题
前端数据看似正常,但可能存在日期格式、特殊字符等问题导致后端反序列化失败:
配置全局JSON序列化规则,统一日期格式并保持属性名一致:
builder.Services.AddControllersWithViews() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; // 保持属性名大小写与ViewModel一致 options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); // 指定日期格式,避免解析错误 options.JsonSerializerOptions.DateTimeFormat = new JsonDateFormatInfo { DateFormatString = "yyyy-MM-dd" }; });手动接收并解析JSON,排查反序列化错误:
[HttpPost] public async Task<IActionResult> LoadCalendar() { using var reader = new StreamReader(Request.Body); var rawJson = await reader.ReadToEndAsync(); // 手动反序列化,可在这里打断点查看JSON内容和解析结果 var calendarList = JsonSerializer.Deserialize<List<CalendarListViewModel>>(rawJson); // 后续逻辑 }
4. 检查视图模型属性绑定
确认视图模型的所有属性都能被正确绑定:
- 检查
DateTime类型属性是否有合法的日期值,避免传入无效格式的日期 - 确保布尔类型、字符串类型的属性没有无法被解析的异常值
内容的提问来源于stack exchange,提问作者Daniyal Khalil
相关产品推荐
相关产品推荐

