Як відправити список Int з jQuery для ASP.net MVC за замовчуванням модель Binder

Коли я надсилаю список int з jQuery, як це:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    data: {
        pkList: [1,2,3]
    }
});

Тоді jQuery перетворить об'єкт pkList та надішле його поштою таким чином:

pkList[]:1
pkList[]:2
pkList[]:3

Що було б добре, якщо сервер PHP, але я використовую Asp.NET MVC3 і спробую отримати ці значення за допомогою типового сполучного за замовчуванням:

public ActionResult Execute(ICollection pkList)

Але pkList завжди null, здається, що типовий зв'язувач моделі не може його пов'язувати.

Як правильно це вирішити?


ADDED SOLUTION

Я використовував рішення від Даріна Димитрова, встановивши параметр traditional у jQuery:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    traditional: true,
    data: {
        pkList: [1,2,3]
    }
});

Тепер jQuery більше не додає [] до параметрів, і вони надсилаються так:

pkList:1
pkList:2
pkList:3

І зв'язувач моделі за замовчуванням MVC правильно отримує значення.

Сподіваюсь, це допомагає комусь.

14

3 Відповіді

Ви можете використовувати запит JSON, оскільки це дозволить вам відправити будь-які складні об'єкти, які ви хочете:

$.ajax({
    url: '@Url.Action("Execute")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ pkList: [1, 2, 3] }),//you could throw any JavaScript object you like here
    success: function(result) {
       //process the results
    }
});

Метод JSON.stringify будується в сучасних браузерах, і якщо ви хочете підтримувати застарілі веб-переглядачі, ви можете включити json2.js на ваш сайт.

І щоб відповісти на ваше запитання, яке ви могли б використати, встановіть параметр traditional: true , щоб вказати, що jQuery відмовляється від традиційної серіалізації параметрів, оскільки це змінилося в jQuery 1.4, і якщо ви використовуючи пізнішу версію, ви маєте можливість повернутися до того, як параметри серіалізуються:

$.ajax({ 
    url: '@Url.Action("Execute")',
    type: 'POST',
    data: {
        pkList: [1, 2, 3]
    },
    traditional: true
});
17
додано
@PaulT .: Ви точно вказуєте, що серіалізація списку новин jQuery json за замовчуванням не збігається з десеріалізацією Json, яка використовується за промовчанням за замовчуванням. Чи не так трохи дивно тому, що mvc постачається з jQuery?
додано Автор Marc, джерело
@ Дарін Димітров: Дуже дякую, ніколи не відомі параметри traditional у jQuery. Я встановив його в моїх параметрах ajax за промовчанням, і мені ніколи не потрібно турбуватися про це в моєму проекті, це чудово працює! Також добре знати метод JSON.stringify . Я не знаю, чому це не включено в jQuery (з резервуванням до застарілих браузерів), я думаю, що це має бути?
додано Автор Marc, джерело
@PaulT., Ні, типовий зв'язувач моделі не приймає data: {pkList: '1,2,3'} . Якщо ви хочете розглянути такі запити, вам буде потрібно спеціальна зв'язувальна модель, коли вам потрібно буде розділити записи, а потім розібрати кожен назад у ціле число. Не варто було б пройти через цю біль, якщо метою є відправлення масиву цілих чисел до дії контролера.
додано Автор Darin Dimitrov, джерело
Чи не буде застосований типовий зв'язувальний засіб для обробки списком комами, що містять дані, кодовані за формою? Щось подібне до даних : {pkList: '1,2,3'} ? Але в іншому випадку я використовую цей метод для всієї моєї серіалізації моделі, спосіб піти на більш складні об'єкти в JS.
додано Автор Paul Tyng, джерело
ай, так, я бачу, що ви маєте на увазі зараз, просто перевірили його, це дивно, хоча тому, що якщо у вас є два входи з тим самим ім'ям, він дійсно десеріалізує його в списку, просто серіалізація jQuery для формування поштових даних не обробляє це (тобто. pkList = 1 & pkList = 2 працює)
додано Автор Paul Tyng, джерело

Філ Хаак має чудову статтю про свій блог, який повинен вказувати вас у прямому напрямку.

Прив'язка моделі до списку

0
додано
Спасибі подрузі, я прочитав це раніше, але це мені не допомагає, проблема була ще на стороні jQuery :)
додано Автор Marc, джерело

Додайте це, оскільки @Darin пропускає дію контролера.

Код скрипта Java:

function sendArray() {
    var list = ["a", "b"];

    $.ajax({
        url: '@Url.Action("ActionName")',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ list }),
        dataType: "json",
        success: function (response) {},
        error: function (response) {}
    });
}

Код C #

[HttpPost]
public ActionResult ActionName(List list)
{
    return View();
}
0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug