Передача массива в mvc Действие через AJAX

Я пытаюсь передать массив (или IEnumerable) из ints через AJAX в действие MVC, и мне нужна небольшая помощь.

javascript

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {...

и действие контроллера

public ActionResult MyAction(IEnumerable<int> arrayOfValues )

В настоящий момент запрос отформатирован как

controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437

Итак, я почти там, если я беру квадратные скобки, я получаю правильный ответ. Как мне передать этот массив в мой get, чтобы контроллер мог распознать, что это такое?

Большое спасибо за вашу помощь

Dave

Ответ 1

Установите для традиционного свойства значение true, прежде чем принимать вызов get. то есть:.

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 

Ответ 2

У меня были проблемы в прошлом, когда я пытался выполнить POST (не уверен, что это именно то, что вы делаете, но я вспоминаю, что при передаче массива для традиционных должен быть задано значение true.

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({ 
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }              
 });

Ответ 3

Довольно поздний, но другой ответ на те, которые уже присутствуют здесь:

Если вместо $.ajax вы хотите использовать сокращенные функции $.get или $.post, вы можете передать массивы таким образом:


Сокращение GET

var array = [1, 2, 3, 4, 5];
$.get('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}

Сокращенный POST

var array = [1, 2, 3, 4, 5];
$.post('/controller/MyAction', $.param({ data: array }, true), function(data) {});


// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
    // do stuff here
}


Примечания:

  • Логический параметр в $.param предназначен для traditional свойство, , которое ДОЛЖНО быть true, чтобы это работало.

Ответ 4

Ответ на использование "традиционной" опции правильный. Я просто предоставляю дополнительную информацию для этого, кто хочет узнать больше.

Из документации jQuery:

Как и в jQuery 1.8, метод $.param() больше не использует jQuery.ajaxSettings.traditional в качестве настройки по умолчанию и будет по умолчанию - false.

Вы также можете прочитать здесь: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers а также http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

НТН

Ответ 5

Вы должны быть в состоянии сделать это просто отлично:

$.ajax({
   url: 'controller/myaction',
   data: JSON.stringify({
      myKey: myArray
   }),
   success: function(data) { /* Whatever */ }
});

Тогда ваш метод действия будет таким:

public ActionResult(List<int> myKey)
{
    // Do Stuff
}

Для вас, похоже, вам просто нужно выровнять свои значения. JSONValueProvider в MVC преобразует это обратно в IEnumerable для вас.

Ответ 6

ЕСЛИ ВСЕ ЕЩЕ НЕ УДАЛИТЬ...

Ни один из других ответов здесь не решил мою проблему. Я пытался сделать вызов метода GET из JavaScript в контроллер MVC Web API и отправить массив целых чисел в качестве параметра в этом запросе. Я пробовал все решения здесь, но все же параметр моего контроллера приближался к NULL (или ничего для вас, пользователям VB).

В конце концов я нашел свое решение в другом SO post, и это было действительно просто: просто добавьте аннотацию [FromUri] до параметра массива в контроллере ( Мне также пришлось сделать вызов, используя "традиционную" настройку AJAX, чтобы избежать аннотаций в виде скобок). См. ниже фактический код, который я использовал в своем приложении.


Подпись контроллера:

Подпись контроллерa ПРИМЕЧАНИЕ. Аннотация в С# будет [FromUri]


JavaScript:

$.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);});

Фактическая строка URL:

http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning

Ответ 7

Если вы используете ASP.NET Core MVC и вам нужно обрабатывать квадратные скобки (а не использовать "традиционную" опцию jQuery), единственная найденная опция - это ручная сборка IEnumerable в методе контроллера.

string arrayKey = "p[]=";
var pArray = HttpContext.Request.QueryString.Value
    .Split('&')
    .Where(s => s.Contains(arrayKey))
    .Select(s => s.Substring(arrayKey.Length));

Ответ 8

Вам нужно преобразовать массив в строку:

//arrayOfValues = [1, 2, 3];  
$.get('/controller/MyAction', { arrayOfValues: "1, 2, 3" }, function (data) {...

это работает даже в форме int, long или string

public ActionResult MyAction(int[] arrayOfValues )