Передать массив в действие 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, чтобы контроллер мог распознать, что это такое?
большое спасибо за вашу помощь
Дэйв
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, чтобы избежать аннотаций скобок). ниже фактический код, который я использовал в своем приложении.
Контроллер Подпись:
Примечание: Аннотация В 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