通过Ajax Post从JS向.NET控制器传递JSON数据时列表为空的问题
通过Ajax Post从JS向.NET控制器传递JSON数据时列表为空的问题
嘿,我看你遇到了前端传JSON数组到.NET控制器但接收的列表为空的问题,我来帮你梳理下最常见的排查点和解决办法!
1. 给控制器参数添加[FromBody]特性
当你用contentType: "application/json"发送JSON数据时,.NET默认不会自动从请求体里解析数据到参数中,必须显式加上[FromBody]标记,告诉框架从请求体读取并反序列化。
比如你的控制器方法应该改成这样:
[HttpPost] public IActionResult SubmitMovieAdd([FromBody] List<MovieSchedule> schedules) { // 这里就能拿到正确的列表数据了 return Ok(); }
2. 确保后端模型类和前端JSON字段匹配
你前端传递的是包含date和hours字段的对象数组,后端需要定义对应的模型类,并且属性要和前端字段对应(.NET默认支持驼峰和帕斯卡命名的自动匹配,但如果遇到问题可以显式指定):
public class MovieSchedule { // 如果前端是小写的date,这里用大写Date也能匹配,或者显式指定字段名 // [JsonPropertyName("date")] public string Date { get; set; } // 根据前端hours的类型调整,比如如果是字符串数组就用List<string>或string[] public List<string> Hours { get; set; } }
⚠️ 注意:模型类必须是public,并且要有无参构造函数(默认会自动生成,但如果你手动加了有参构造,记得补上无参的)。
3. 验证前端发送的JSON格式合法性
你已经用console.log(JSON.stringify(dataToSend))打印了发送的内容,一定要确认输出的是合法的JSON数组,比如类似这样:
[{"date":"2024-05-20","hours":["10:00","14:00"]},{"date":"2024-05-21","hours":["11:00","15:00"]}]
如果JSON格式有语法错误(比如引号不闭合、逗号多余),.NET会无法解析,导致列表为空。
4. 针对老版本.NET Framework的额外配置
如果你用的是.NET Framework(不是.NET Core/.NET 5+)的Web API,还需要在WebApiConfig.cs里配置JSON序列化的驼峰匹配,否则可能因为命名大小写问题解析失败:
public static void Register(HttpConfiguration config) { // 配置JSON序列化支持驼峰命名匹配 config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); }
按照这几点排查下来,应该就能解决列表为空的问题啦!
备注:内容来源于stack exchange,提问作者Bogdan Alexandru Rus
相关产品推荐
相关产品推荐

