ASP.NET 6中向控制器传递对象数组时参数为空的问题排查
解决ASP.NET Core 6中Ajax传对象数组到控制器参数为null的问题
问题根源
你的代码存在两个关键问题导致参数接收失败:
- Ajax请求里,你把JSON字符串包装成了
{"data": JSON.stringify(model)}的键值对结构,但同时设置了contentType: 'application/json',ASP.NET Core无法正确解析这种格式的请求体。 - 控制器方法的参数未添加
[FromBody]特性,ASP.NET Core默认从表单数据绑定参数,而非请求体中的JSON内容。
修正后的代码
1. jQuery Ajax代码调整
<script type="text/javascript"> function check() { debugger var model = @Html.Raw(Json.Serialize(@ViewBag.alldata)); $.ajax({ contentType: 'application/json; charset=utf-8', dataType: 'json', url: "/Home/exporttocsv", data: JSON.stringify(model), // 直接传递序列化后的JSON数组,无需包装成对象 type: 'POST', success: function (data) { location.href = '@Url.Action("DownloadCSV", "Home")?success=' + data; } }); }; </script>
2. C#控制器代码调整
public class HomeController: Controller { [HttpPost] public string exporttocsv([FromBody] List<ShowNihSearchData> data) // 添加[FromBody]特性指定从请求体解析参数 { // 处理data的业务逻辑... } }
额外注意事项
- 确保
ShowNihSearchData模型的属性名与JSON中的键完全匹配(大小写敏感)。如果C#模型用帕斯卡命名(如GrantNumber)、JSON用驼峰命名(grantNumber),可在模型属性上添加[JsonPropertyName("grantNumber")]特性,或者在Program.cs中全局配置JSON序列化规则:builder.Services.AddControllersWithViews() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); - 确认
ViewBag.alldata确实是List<ShowNihSearchData>类型,序列化后能生成合法的JSON数组。
内容的提问来源于stack exchange,提问作者Sagar Saini
相关产品推荐
相关产品推荐

