Параметр массива ASP.NET MVC Int с пустым массивом по умолчанию равен {0} - PullRequest
4 голосов
/ 27 октября 2010

У меня есть действие контроллера как:

Public ActionResult MyAction(int[] stuff){}

Я делаю JSON-запрос вроде:

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

Когда он достигает C #, он выглядит как массив с одним элементом, который равен нулю (то есть, как если бы я сделал int[] stuff = {0};).

Это новое для MVC 2 или .NET 4? Кажется, это недавно изменилось, но я не нашел дымящийся пистолет. Как я могу обойти это? Это не может быть ожидаемым поведением, не так ли?

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Я думаю, что это ошибка в 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[]));

Если мы посмотрим на ValueProviderResult.cs в функции UnwrapPossibleArrayType, то увидим:

// 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, это один из них.

0 голосов
/ 28 октября 2010

Когда я тестировал код, я получил массив null в действии контроллера, а не массив с одним элементом.

В jquery 1.4 и более поздних версиях способ сериализации параметров во время запроса AJAX изменился и больше не совместим с подшивкой модели по умолчанию. Вы можете установить традиционный параметр при выполнении запроса:

$.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) { }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...