不使用jQuery,如何将JS对象数组作为Ajax参数传给ASP.Net MVC控制器?
没问题,我来帮你搞定这个问题——不用任何JS库,纯原生代码就能把对象数组传给ASP.NET MVC控制器。你之前用GET拼接URL的方式只适合简单参数,要传复杂的对象数组,我们需要调整几个地方:
核心思路
- 把请求从
GET改成POST:GET的URL长度有限,且传递复杂数据格式繁琐,POST的请求体更适合承载这类数据 - 将JS对象数组转为JSON字符串:用原生的
JSON.stringify()方法处理 - 设置正确的请求头:告诉服务器我们发送的是JSON格式数据
- 调整控制器和模型类,确保能正确接收并绑定数据
修改后的原生JS代码
var data = []; data.push(new person(1, "David")); data.push(new person(2, "Karine")); data.push(new person(3, "Annie")); function person(_id, _name) { this.id = _id; this.name = _name; } var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { var obj = JSON.parse(xmlhttp.responseText); // 处理返回的结果,这里保留你原来的逻辑 for (var i = 0; i < obj.length; i++) { if (i == 1) { alert(obj[i].name); } } } else { alert('请求出错了,状态码:' + xmlhttp.status); } } }; // 改成POST请求,不需要在URL里拼参数 xmlhttp.open("POST", "/Home/AjaxTester", true); // 关键:设置请求头,告知服务器请求体是JSON格式 xmlhttp.setRequestHeader("Content-Type", "application/json"); // 将JS对象数组转为JSON字符串发送 xmlhttp.send(JSON.stringify(data));
调整ASP.NET MVC端代码
1. 给Person类添加无参构造函数
MVC的模型绑定器需要无参构造函数来创建对象并赋值属性,否则会绑定失败,修改你的Person类:
public class Person { public int id { get; set; } = 0; public string name { get; set; } = ""; // 添加无参构造函数(必须) public Person() {} // 保留你原来的带参构造函数 public Person(int _id, string _name) { this.id = _id; this.name = _name; } }
2. 修改控制器Action
给Action添加[HttpPost]特性,确保它接受POST请求:
[HttpPost] // 必须添加,指定这个Action只处理POST请求 public JsonResult AjaxTester(List<Person> _person) { // 这里可以处理传入的_person列表,比如做业务逻辑 // 示例:返回处理后的对象 var _someObjects = _person.Select(p => new { id = p.id, greeting = "Hello, " + p.name }); // 如果是ASP.NET MVC 5及以上,JsonRequestBehavior.AllowGet可以省略 return Json(_someObjects, JsonRequestBehavior.AllowGet); }
关键注意点
- 请求头必须设置:如果不设置
Content-Type: application/json,MVC的模型绑定器无法识别请求体里的JSON,会导致_person参数为null - 无参构造函数不能少:模型绑定器依赖它来实例化Person对象,没有的话会绑定失败
- 用POST而不是GET:GET请求不适合传递复杂数据,且有URL长度限制,POST是更合适的选择
内容的提问来源于stack exchange,提问作者Dave D
相关产品推荐
相关产品推荐

