Передать массив в действие MVC через AJAX - PullRequest
120 голосов
/ 30 марта 2011

Я пытаюсь передать массив (или IEnumerable) целых чисел через 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

Ответы [ 10 ]

147 голосов
/ 30 марта 2011

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

jQuery.ajaxSettings.traditional = true

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 
114 голосов
/ 30 марта 2011

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

 var arrayOfValues = new Array();

 //Populate arrayOfValues 
 $.ajax({ 
      type: "POST",
      url: "<%= Url.Action("MyAction","Controller")%>",
      traditional: true,
      data: { 'arrayOfValues': arrayOfValues }              
 });
48 голосов
/ 18 октября 2013

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

Если вместо $.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, чтобыработа .
9 голосов
/ 26 августа 2013

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

Из документации 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

НТН

7 голосов
/ 30 марта 2011

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

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

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

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

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

2 голосов
/ 11 августа 2016

ЕСЛИ ВСЕ ДРУГИЕ ОТКАЗЫ ...

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

В конце концов я нашел свое решение в другой записи SO , и это было на самом деле очень просто: просто добавьте аннотацию [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
0 голосов
/ 25 марта 2019

Здесь немного поздно, но я мог бы использовать решение SNag дальше в $ .ajax (). Вот код, если он кому-нибудь поможет:

var array = [1, 2, 3, 4, 5];

$.ajax({
    type: "GET",
    url: '/controller/MyAction',
    data: $.param({ data: array}, true),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
    },
    error: function (x, y, z) {
    }
});

// Action Method
public void MyAction(List<int> data)
{
    // do stuff here
}
0 голосов
/ 06 марта 2019

Если вы переходите на ASP.NET Core MVC из .Net Framework MVC, как я, вещи немного изменились. Вызов ajax должен выполняться для необработанного объекта с использованием stringify, поэтому вместо передачи данных { vals: arrayOfValues } он должен быть JSON.stringify(arrayOfValues) следующим образом:

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

Другое изменение, внесенное в ASP.NET Core, заключается в том, чтобы предотвратить подделку межсайтовых запросов, поэтому для вызовов действия MVC из метода ajax атрибут [FromBody] должен быть применен к параметру действия следующим образом:

public ActionResult MyAction([FromBody] IEnumerable<int> arrayOfValues )
0 голосов
/ 21 декабря 2018

Если вы используете 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));
0 голосов
/ 24 июня 2016

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

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

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

public ActionResult MyAction(int[] arrayOfValues )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...