ASP.NET MVC控制器接收Ajax参数时myValue始终为null的问题
问题原因
你当前的问题是前端发送的JSON结构与后端控制器参数不匹配,导致模型绑定失败,myValue始终为null。前端发送的是包含对象的数组,而后端期望接收单个string类型参数,ASP.NET MVC无法自动完成这种类型转换。
解决方案
方案1:创建对应模型类接收数组(推荐)
这种方式符合规范,便于后续扩展:
- 后端定义与前端JSON结构匹配的模型类:
public class PropertyItem { public string Name { get; set; } public string Value { get; set; } }
- 修改控制器方法,添加
[FromBody]特性确保从请求体绑定数据:
[HttpPost] public async Task<ActionResult> Test([FromBody] List<PropertyItem> myValue) { // myValue将正确接收前端发送的数组数据 return Json("something"); }
- 前端代码保持不变即可,数组JSON与
List<PropertyItem>结构完全匹配:
var props = [ { "Name": "firstName", "Value": "firstValue" }, { "Name": "secondName", "Value": "secondValue" } ]; $.ajax({ url: '/myURL', contentType: "application/json", async: true, type: "POST", data: JSON.stringify(props), error: function (jqXHR, textStatus, errorThrown) { console.log("FAIL: " + errorThrown); }, success: function (data, textStatus, jqXHR) { console.log("SUCCESS!"); } });
方案2:包装数组为对象属性,适配string参数(临时场景)
如果必须用string myValue接收,可调整前端数据结构:
- 前端将数组包装到
myValue属性中:
data: JSON.stringify({ myValue: props })
- 后端控制器方法保持不变,MVC会自动解析对象中的
myValue属性:
[HttpPost] public async Task<ActionResult> Test(string myValue) { // 可手动反序列化JSON字符串: // var props = JsonConvert.DeserializeObject<List<PropertyItem>>(myValue); return Json("something"); }
方案3:直接接收JSON字符串(特殊场景)
若需直接接收数组的JSON字符串,调整前后端如下:
- 前端将数组转成JSON字符串后再次序列化,确保发送纯字符串:
data: JSON.stringify(JSON.stringify(props))
- 后端添加
[FromBody]特性接收字符串:
[HttpPost] public async Task<ActionResult> Test([FromBody] string myValue) { // myValue即为前端数组的JSON字符串 return Json("something"); }
内容的提问来源于stack exchange,提问作者TheBoubou
相关产品推荐
相关产品推荐

