Передать массив в действие MVC с использованием AJAX



Я пытаюсь передать массив (или IEnumerable) ints из via 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, чтобы контроллер мог распознать, что это такое?



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



Дэйв

665   7  

7 ответов:

установите традиционное свойство в true перед выполнением вызова get. т. е.:

jQuery.ajaxSettings.traditional = true

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

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

 var arrayOfValues = new Array();

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

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

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


Стенография получить

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
}

Стенография Пост

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
}


Примечания:

  • параметр boolean в $.param для traditional собственность что Должно быть true для этого.

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

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

по состоянию на jQuery 1.8,$.метода param() больше не используется jQuery.ajaxSettings.традиционные включена по умолчанию и будет по умолчанию значение 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

HTH

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

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

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

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

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

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

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

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


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

Controller Signature Примечание: Аннотация В C# будет [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

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

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

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

public ActionResult MyAction(int[] arrayOfValues )

Comments

    Ничего не найдено.