带有空数组的ASP.NET MVC Int Array参数默认为{0}

时间:2010-10-27 18:15:06

标签: asp.net asp.net-mvc asp.net-mvc-2

我有一个控制器动作,如:

Public ActionResult MyAction(int[] stuff){}

我发出了一个JSON请求:

$.getJSON(url, { stuff: [] })

当它到达C#时,它看起来像一个包含一个元素的数组,它是零(即如果我做int[] stuff = {0};)。

这是MVC 2还是.NET 4的新功能?它似乎最近有所改变,但我还没有找到一支冒烟的枪。我怎么能绕过这个?这不可能是预期的行为,可以吗?

2 个答案:

答案 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) { }
});