使用AJAX向Controller传字符串遇null或400错误,求解答
解决POST请求参数为null或400错误的问题
我明白你卡在这里一整天的心情,查了一堆资料还是没搞定,肯定超闹心!咱们直接拆解问题:
你的前端代码把整个myPerson对象序列化成JSON字符串发送,但后端Action的参数是单个string name——ASP.NET MVC的默认模型绑定器没办法直接从JSON请求体里提取单个字符串参数,这就是name一直为null的原因;如果请求格式和后端预期不匹配,还会触发400错误请求。
给你两种可行的解决方案:
方案一:使用模型类接收参数(推荐,更符合MVC规范)
这种方式适合以后可能扩展参数的场景,也更清晰:
- 先创建一个和前端传递结构对应的视图模型类:
public class PersonViewModel { public string Name { get; set; } }
- 修改Controller的Action方法,用这个模型类作为参数:
[HttpPost] public ActionResult CreatePerson(PersonViewModel model) { Person person = new Person(); person.Name = model.Name; _context.Person.Add(person); _context.SaveChanges(); return Json(person); }
这样模型绑定器就能自动解析JSON请求体里的Name属性,完美匹配参数。
方案二:调整前端请求格式(适合简单参数场景)
如果不想新增模型类,也可以直接修改前端请求,让参数格式和后端预期一致:
var myPerson = {}; myPerson.name = "Brandon"; function createObject() { $.ajax({ contentType: "application/x-www-form-urlencoded;charset=utf-8", dataType: 'json', type: 'POST', url: '/Person/CreatePerson', data: myPerson, // 直接传对象,jQuery会自动转成键值对格式 success: function (response) { alert(JSON.stringify(response)); // 顺便修正了你这里遗漏的闭合括号 }, error: function (e) { alert(e.responseText); } }) }
这里要注意两点:
- 去掉
JSON.stringify(),直接传myPerson对象,jQuery会自动把它转换成name=Brandon的键值对格式 - 把
contentType改成application/x-www-form-urlencoded(其实jQuery默认就是这个,明确写出来更直观),这样后端的string name就能正确接收到值了。
另外顺便提一句,你原JS代码里的alert(JSON.stringify(myPerson);少了一个闭合的),这也可能导致代码执行异常,我在方案二里已经帮你修正啦。
内容的提问来源于stack exchange,提问作者Brandon Christopher
相关产品推荐
相关产品推荐

