如何通过AJAX请求将JSON字符串传递给.NET Core控制器方法?
解决.NET Core控制器接收JSON参数为null的问题
我尝试将JSON数据通过AJAX传递给.NET Core控制器方法,但方法内的参数值始终为null。已经将places设为字面量确保传递的是合法JSON,但问题依旧。
前端代码
function GetRatedPlaces(places) { places = { name: "John", age: 30, city: "New York" }; var placesJson = JSON.stringify(places); console.log(placesJson); $.ajax({ type: 'POST', url: '@Url.Action("GetRatedPlaces", "Home")', contentType: 'application/json', data: placesJson, cache: false, success: function (result) { // Handle the response from the controller } }); }
控制器代码
[HttpPost] public IActionResult GetRatedPlaces([FromBody] string places) { // Deserialize places here. return Ok(); }
问题原因
当使用[FromBody] string places接收参数时,.NET Core期望的是JSON格式的字符串(即被双引号包裹的字符串,例如"{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"),但当前传递的是一个JSON对象({"name":"John",...}),框架无法将JSON对象直接解析为string类型,因此参数值为null。
方案一:使用实体类接收(推荐)
定义与JSON结构匹配的实体类,让框架自动完成绑定,这是.NET Core处理JSON参数的标准方式:
- 创建实体类:
public class PlaceModel { public string Name { get; set; } public int Age { get; set; } public string City { get; set; } }
- 修改控制器方法:
[HttpPost] public IActionResult GetRatedPlaces([FromBody] PlaceModel places) { // 直接使用places的属性,无需手动反序列化 // 例如:var name = places.Name; return Ok(); }
前端代码无需修改,保持原有写法即可。
方案二:强制传递JSON字符串(仅适用于必须用string接收的场景)
如果一定要用string类型接收,需要将JSON字符串再次序列化,让传递的内容是一个符合JSON格式的字符串:
修改前端代码中的placesJson赋值:
var placesJson = JSON.stringify(JSON.stringify(places));
此时传递的内容是"{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}",框架会正确解析为string类型的参数。
内容的提问来源于stack exchange,提问作者B. Jones
相关产品推荐
相关产品推荐

