我有一个控制器动作,如:
Public ActionResult MyAction(int[] stuff){}
我发出了一个JSON请求:
$.getJSON(url, { stuff: [] })
当它到达C#时,它看起来像一个包含一个元素的数组,它是零(即如果我做int[] stuff = {0};
)。
这是MVC 2还是.NET 4的新功能?它似乎最近有所改变,但我还没有找到一支冒烟的枪。我怎么能绕过这个?这不可能是预期的行为,可以吗?
答案 0 :(得分:2)
我认为这是MVC中的一个错误:
// create a vpr with raw value and attempted value of empty string
ValueProviderResult r = new ValueProviderResult("", "", System.Globalization.CultureInfo.CurrentCulture);
// this next line returns {0}
r.ConvertTo(typeof(int[]));
如果我们在函数UnwrapPossibleArrayType中查看ValueProviderResult.cs,我们会看到:
// case 2: destination type is array but source is single element, so wrap element in array + convert
object element = ConvertSimpleType(culture, value, destinationElementType);
IList converted = Array.CreateInstance(destinationElementType, 1);
converted[0] = element;
return converted;
它强制converted[0]
为元素,而ConvertSimpleType将“”强制转换为0.所以我关闭了这个问题,除非有人有更多信息。
编辑:此外,这不在修订版17270中,所以如果你要列出从MVC 1变为MVC 2的内容,这就是其中之一。
答案 1 :(得分:0)
当我测试代码时,我在控制器操作中得到null
数组,而不是带有一个元素的数组。
在jquery 1.4及更高版本中,AJAX请求期间参数序列化的方式已更改,并且不再与默认模型绑定器兼容。您可以在执行请求时设置traditional参数:
$.getJSON(url, $.param({ stuff: [ 1, 2, 3 ] }, true));
或
$.ajax({
url: url,
type: 'GET',
dataType: 'JSON',
data: { stuff: [ 1, 2, 3 ] },
traditional: true,
success: function(res) { }
});