You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AJAX向Controller传字符串遇null或400错误,求解答

解决POST请求参数为null或400错误的问题

我明白你卡在这里一整天的心情,查了一堆资料还是没搞定,肯定超闹心!咱们直接拆解问题:

你的前端代码把整个myPerson对象序列化成JSON字符串发送,但后端Action的参数是单个string name——ASP.NET MVC的默认模型绑定器没办法直接从JSON请求体里提取单个字符串参数,这就是name一直为null的原因;如果请求格式和后端预期不匹配,还会触发400错误请求。

给你两种可行的解决方案:

方案一:使用模型类接收参数(推荐,更符合MVC规范)

这种方式适合以后可能扩展参数的场景,也更清晰:

  1. 先创建一个和前端传递结构对应的视图模型类:
public class PersonViewModel
{
    public string Name { get; set; }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:53