.NET Core中Ajax调用Controller时username参数为null的问题求助
解决.NET Core Ajax传参Controller获取null的问题
问题原因
你当前的Ajax请求是以application/json格式发送JSON对象,但.NET Core默认不会从请求体中解析单个简单类型参数(比如string),需要显式声明或者调整传参方式。
方案一:后端添加[FromBody]并使用DTO接收(推荐)
由于你前端传递的是包含username属性的JSON对象,最规范的做法是创建一个DTO类来接收参数,同时给参数加上[FromBody]特性,告诉框架从请求体中解析数据:
- 创建请求DTO类:
public class UserQueryRequest { public string Username { get; set; } }
- 修改HomeController的Users方法:
public JsonResult Users([FromBody] UserQueryRequest request) { // 此时request.Username即可获取到前端传入的值 List<User> Users = new List<User>() { new User { Id = 1, Name = "John Doe", Age = 30 }, new User { Id = 2, Name = "Jane Doe", Age = 25 }, new User { Id = 3, Name = "Sammy Doe", Age = 22 } }; return Json(Users); }
前端代码保持不变即可,因为你已经正确设置了contentType: "application/json; charset=utf-8"并使用JSON.stringify处理数据。
方案二:调整前端传参格式(无需修改后端)
如果不想创建DTO,可以改为发送表单格式的数据,此时后端无需修改就能直接获取参数:
修改前端Ajax代码:
$(document).ready(function () { $("#btnMe").click(function () { $.ajax({ type: "POST", url: "HOME/Users", data: { username: $("#username").val() }, // 直接传对象,不用JSON.stringify dataType: "json", success: function (response) { $(response).each(function (index, item) { console.log(item); }); } }); }); });
这种方式下,jQuery会自动将数据编码为application/x-www-form-urlencoded格式,.NET Core默认会从表单数据中解析简单类型参数,所以username参数能正常获取到值。
额外说明
如果一定要用[FromBody]接收单个string类型参数,需要前端直接传递字符串的JSON格式,而不是对象:
data: JSON.stringify($("#username").val()),
同时后端方法改为:
public JsonResult Users([FromBody] string username) { // ... 逻辑不变 }
但这种方式不如使用DTO灵活,后续扩展参数会更麻烦,因此更推荐方案一。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

