从AJAX向MVC控制器传字符串数组时遇空引用异常排查
我来帮你梳理下可能导致这个问题的几个常见原因——毕竟你说前端数组明明有值,但控制器这边拿不到,大概率是数据传递的环节出了问题:
AJAX请求的Content-Type设置缺失
如果你是用JSON格式传递数组,一定要在AJAX里指定contentType: "application/json; charset=utf-8",不然MVC的模型绑定器没法正确解析你传过来的数据。很多人容易忽略这一步,直接导致控制器接收到的参数为null。前后端参数名称不匹配
仔细核对AJAX里发送的参数名和控制器方法的参数名,连大小写都要完全一致!比如前端传的是selectedRows,控制器参数写成SelectedRows,就会因为大小写差异导致绑定失败。数组未正确序列化为JSON
如果你的数组是包含多属性的复杂行数据,记得要用JSON.stringify()把数组转成JSON字符串再发送。要是直接传原生数组对象,MVC可能没法识别它的结构,自然接收不到有效数据。举个正确的示例:$.ajax({ url: "/YourController/RenderPartialView", type: "POST", contentType: "application/json; charset=utf-8", data: JSON.stringify(yourSelectedRowsArray), // 必须序列化 success: function(result) { // 渲染局部视图的逻辑 } });控制器参数类型不匹配
确认控制器的参数类型和前端传递的数组类型完全对应。比如前端传的是字符串ID数组,控制器参数就应该是string[] selectedIds;如果是自定义行对象数组,后端要创建对应的实体类,且属性名和前端对象的属性名一致(同样注意大小写)。HTTP请求方法不匹配
要是你的控制器方法标记了[HttpPost],AJAX里的type就得设为"POST";如果是[HttpGet],数组传递的方式要改成URL拼接(比如?selectedIds=1&selectedIds=2),用错请求方法肯定会导致参数接收失败。未添加[FromBody]特性
对于POST请求传递的JSON数据,有时候需要在控制器参数前加上[FromBody]特性,明确告诉模型绑定器从请求体中读取数据,示例如下:public ActionResult RenderPartialView([FromBody] List<YourRowModel> selectedRows) { // 后续遍历逻辑的占位符 return PartialView("_YourPartialView"); }
你可以对照这几点逐一排查,应该能快速定位到问题所在。
内容的提问来源于stack exchange,提问作者UnintentionalWebDev

