AJAX方法无法向C#控制器传递参数,参数始终为null
问题原因
你当前代码的问题在于:当通过JSON.stringify发送JSON格式请求体时,ASP.NET MVC默认的模型绑定不会将JSON对象中的属性直接映射到单个字符串参数上。控制器的string Name参数默认会从表单数据、路由或查询字符串中取值,而不会解析请求体里的JSON对象。
解决方案
以下几种方法都可以解决这个问题,选适合你的即可:
方法1:创建模型类配合[FromBody]
先定义一个与JSON结构匹配的模型类:
public class TireRequestModel { public string Name { get; set; } }
然后修改控制器方法,用[FromBody]标记模型参数,让框架从JSON请求体中绑定数据:
[HttpPost] public ActionResult Tire([FromBody] TireRequestModel request) { string p = request.Name; return View("Tires"); }
JS代码不需要修改,保持原来的JSON.stringify和contentType设置即可。
方法2:直接发送表单格式数据
如果你不想创建模型类,可以修改AJAX请求,直接发送表单编码格式的数据,这样控制器的单个参数能直接被绑定:
function createObject(x) { $.ajax({ type: "POST", url: "/Home/Tire", data: { Name: x }, // 直接传键值对,无需JSON.stringify dataType: "json", success: OnSuccess, failure: function (response) { //failure message } }); function OnSuccess(response) { //do your stuff after success response } }
控制器代码保持不变即可,因为默认的模型绑定会解析表单格式的Name=x数据。
方法3:用JObject接收JSON数据
如果不想创建模型类,也可以用JObject直接读取JSON请求体中的属性:
using Newtonsoft.Json.Linq; [HttpPost] public ActionResult Tire([FromBody] JObject jsonData) { string p = jsonData["Name"].ToString(); return View("Tires"); }
JS代码同样不需要修改。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

