使用jQuery .ajax()向ASP.NET MVC Kestrel控制器提交数据时遇HTTP 400错误
解决Kestrel Web应用中AJAX注册请求返回HTTP 400错误的方案
常见错误原因及对应解决方案
1. 控制器方法未添加[FromBody]特性
ASP.NET Core不会自动从JSON格式的请求体中绑定参数,必须显式添加[FromBody]特性才能正确解析请求数据,这是导致400错误的最常见原因。
修正后的控制器代码示例:
[HttpPost] [Consumes("application/json")] public IActionResult AddUserToDatabase([FromBody] UserModel user) { // 写入SQLite数据库逻辑 // 示例:_dbContext.Users.Add(new User { UserName = user.UserName }); // _dbContext.SaveChanges(); return Ok("注册成功"); } // 匹配请求的模型类 public class UserModel { public string UserName { get; set; } }
2. AJAX请求数据序列化不规范
要确保AJAX传递的JSON结构和控制器接收的模型完全匹配,且必须用JSON.stringify()正确序列化数据,不能直接传递字符串。
修正后的AJAX代码:
$("#registerBtn").click(function() { var userName = $("#userNameInput").val(); $.ajax({ url: "/Session/AddUserToDatabase", type: "POST", contentType: "application/json", dataType: "json", data: JSON.stringify({ UserName: userName }), // 键名必须和模型属性名一致 success: function(res) { alert(res); }, error: function(xhr) { console.log("错误状态:" + xhr.status + ",信息:" + xhr.responseText); } }); });
3. CSRF令牌验证失败
ASP.NET Core默认启用CSRF保护,AJAX请求如果未携带CSRF令牌,会直接返回400错误。
解决方案:
- 先在HTML页面中添加CSRF令牌的meta标签:
<meta name="csrf-token" content="@Html.AntiForgeryToken()" />
- 在AJAX请求中携带令牌:
$.ajax({ // 其他配置项 headers: { "RequestVerificationToken": $('meta[name="csrf-token"]').attr('content') }, // ... });
- 测试阶段可临时禁用验证(生产环境不推荐):在控制器方法上添加
[IgnoreAntiforgeryToken]特性。
4. 路由路径不匹配
检查AJAX的url是否和控制器的路由配置一致。比如如果控制器使用了路由特性:
[Route("api/[controller]")] public class SessionController : ControllerBase { [HttpPost("AddUser")] public IActionResult AddUserToDatabase([FromBody] UserModel user) { // ... } }
此时AJAX的url必须写为"/api/Session/AddUser",而非"/Session/AddUserToDatabase"。
5. 模型验证失败
如果模型添加了数据验证规则(比如[Required]),提交空用户名会导致模型绑定失败,返回400错误。可以在控制器中主动验证模型状态,返回具体错误信息:
[HttpPost] [Consumes("application/json")] public IActionResult AddUserToDatabase([FromBody] UserModel user) { if (!ModelState.IsValid) { return BadRequest(ModelState); // 返回具体的验证错误,方便调试 } // 数据库操作逻辑 return Ok(); } // 带验证规则的模型类 public class UserModel { [Required(ErrorMessage = "用户名不能为空")] public string UserName { get; set; } }
调试建议
- 打开浏览器开发者工具(F12),查看「网络」标签的请求详情:检查请求体的JSON格式是否正确,查看响应的具体错误信息。
- 在控制器方法第一行加断点,确认方法是否被命中——如果没命中,说明路由或请求格式有问题。
- 检查SQLite数据库连接字符串是否正确,确保应用有读写数据库的权限。
内容的提问来源于stack exchange,提问作者Chris159
相关产品推荐
相关产品推荐

