如何将JavaScript对象数组提交至C# MVC接收元组数组的Action方法?
解决JavaScript对象数组传递到MVC值元组数组Action的问题
这个问题我之前也踩过坑,主要是MVC默认的模型绑定器对值元组数组的支持不够顺畅,再加上$.post默认的请求格式不适合复杂数组传递,才导致你的objectArray一直是null。下面给你几个实用的解决方案:
方案一:改用自定义类代替值元组(最推荐)
值元组虽然简洁,但模型绑定器对它的数组类型处理不如普通类直观。你可以先定义一个和JS对象结构匹配的类:
public class ItemModel { public int Id { get; set; } public string Value { get; set; } }
然后把Action方法的参数改成这个类的数组:
public JsonResult Test(ItemModel[] objectArray) { return Json(objectArray != null); }
JS代码不需要任何修改,直接用你原来的$.post('test', objectArray)就行,MVC的模型绑定器会自动把JS对象映射到类的属性上,这样参数就能正确接收了。
方案二:调整JS请求格式,用JSON传递(保留值元组)
如果你一定要用值元组,那需要修改JS的请求方式,确保数据以JSON格式发送——$.post默认会把数据序列化为表单格式,这种格式下模型绑定器无法正确解析值元组数组。
修改后的JS代码:
var objectArray = [ { id: 1, value: "one" }, { id: 2, value: "two" } ]; $.ajax({ url: 'test', type: 'POST', contentType: 'application/json', // 关键:指定请求内容类型为JSON data: JSON.stringify(objectArray), // 将数组转为JSON字符串 success: function(result) { console.log(result); } });
这样你的原Action方法public JsonResult Test((int id, string value)[] objectArray)就能正确接收到数据了,因为MVC的模型绑定器可以解析JSON格式中的命名参数,和值元组的命名匹配上。
为什么原来的代码会失败?
$.post默认的contentType是application/x-www-form-urlencoded,它会把数组序列化成类似objectArray[0].id=1&objectArray[0].value=one的格式,这种格式下模型绑定器无法识别值元组的结构。- MVC默认模型绑定器对值元组数组的支持有限,尤其是表单格式的请求,很难自动映射到值元组的元素上。
内容的提问来源于stack exchange,提问作者Rian Mostert
相关产品推荐
相关产品推荐

