Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC Int Array parameter with empty array defaults to {0}

I have a controller action like:

Public ActionResult MyAction(int[] stuff){}

I make a JSON request like:

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

When it gets to C# it looks like an array with one element in it, which is zero (i.e. like if I did int[] stuff = {0};).

Is this new with MVC 2 or .NET 4? It seems to have changed recently, but I haven't found a smoking gun. How can I get around this? This can't possibly be expected behavior, can it?

like image 585
Xodarap Avatar asked Oct 27 '10 18:10

Xodarap


1 Answers

I think this is a bug in 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[]));

If we look at ValueProviderResult.cs in function UnwrapPossibleArrayType, we see:

// 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;

It forces converted[0] to be element, and ConvertSimpleType casts "" to 0. So I'm closing this question, unless someone has more info.

EDIT: Also, this is not in revision 17270, so if you're making a list of things which change from MVC 1 to MVC 2, this is one of them.

like image 102
Xodarap Avatar answered Nov 15 '22 00:11

Xodarap