Я пытаюсь передать массив объектов в метод контроллера MVC с помощью функции jQuery ajax (). Когда я перехожу к методу контроллера PassThing () C #, аргумент «вещи» равен нулю. Я пробовал это, используя тип List в качестве аргумента, но это тоже не работает. Что я делаю не так?
<script type="text/javascript">
$(document).ready(function () {
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: 'POST',
url: '/Xhr/ThingController/PassThing',
data: JSON.stringify(things)
});
});
</script>
public class ThingController : Controller
{
public void PassThing(Thing[] things)
{
// do stuff with things here...
}
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
}
c#
asp.net-mvc
jquery
зимородок
источник
источник
Ответы:
Используя предложение NickW, я смог заставить это работать, используя
things = JSON.stringify({ 'things': things });
вот полный код.Из этого я извлек две вещи:
Параметры contentType и dataType абсолютно необходимы в функции ajax (). Без них ничего не получится. Я выяснил это после долгих проб и ошибок.
Чтобы передать массив объектов методу контроллера MVC, просто используйте формат JSON.stringify ({'things': things}).
Надеюсь, это поможет кому-то другому!
источник
http://localhost:52459/Sales/completeSale?itemsInCart=[{"ItemId":1,"Quantity":"1","Price":3.5}]
иSales.completeSale
будетpublic ActionResult completeSale(ItemInCart[] itemsInCart)
, аннотированный какHttpGet
.data: JSON.stringify(things),
dataType
не обязательно. Если его опустить, функция ajax будет работать с ним на основе возвращаемых данныхНе могли бы вы просто сделать это?
... и отметьте свое действие значком
источник
Форматирование ваших данных может быть проблемой. Попробуйте одно из этих:
Или (из раздела Как я могу отправить массив строк в контроллер ASP.NET MVC без формы? )
источник
Я использую веб-приложение .Net Core 2.1 и не могу получить здесь ни одного ответа. У меня либо пустой параметр (если метод вообще был вызван), либо ошибка сервера 500. Я начал экспериментировать со всевозможными комбинациями ответов и наконец получил рабочий результат.
В моем случае решение было следующим:
Сценарий - преобразование исходного массива в строку (без использования именованного свойства)
А в методе контроллера используйте [FromBody]
Сбои включают:
Именование контента
data: {content: nodes}, // Ошибка сервера 500
Отсутствие contentType = Ошибка сервера 500
Ноты
dataType
не требуется, несмотря на то, что говорится в некоторых ответах, поскольку он используется для декодирования ответа (поэтому не имеет отношения к примерам запросов здесь).List<Thing>
также работает в методе контроллераисточник
У меня есть идеальный ответ на все это: я пробовал так много решений, которые, наконец, не смогли заставить себя справиться, пожалуйста, найдите подробный ответ ниже:
Controler
источник
Единственный способ заставить это работать - передать JSON в виде строки, а затем десериализовать ее с помощью
JavaScriptSerializer.Deserialize<T>(string input)
, что довольно странно, если это десериализатор по умолчанию для MVC 4.Моя модель имеет вложенные списки объектов, и лучшее, что я мог получить, используя данные JSON, - это самый верхний список, в котором содержится правильное количество элементов, но все поля в элементах были пустыми.
Такие вещи не должны быть такими сложными.
источник
Это рабочий код вашего запроса, вы можете его использовать.
Controler
Javascript
источник
Обертывание вашего списка объектов другим объектом, содержащим свойство, которое соответствует имени параметра, ожидаемого контроллером MVC, работает. Важный бит - это оболочка вокруг списка объектов.
источник
источник
Если вы используете веб-API ASP.NET, вам нужно просто пройти
data: JSON.stringify(things)
.И ваш контроллер должен выглядеть примерно так:
источник
Модификация от @veeresh i
источник
Что я сделал при попытке отправить некоторые данные из нескольких выбранных строк в DataTable в действие MVC:
HTML В начале страницы:
(отображается только строка, привязка к модели):
Кнопка, запускающая функцию JavaScript:
Функция JavaScript:
Действие MVC:
И МОДЕЛЬ на C #:
ВЫВОД:
Причина ОШИБКИ:
Атрибут Is:
[ValidateAntiForgeryToken]
для действия MVCStartWorkflow
Решение в вызове Ajax:
Чтобы отправить Список объектов, вам необходимо сформировать данные как в примере (заполнение объекта списка) и:
данные: {модель: список},
тип: "сообщение",
источник
Вот как это работает для меня:
С «ContentType» в заглавной «C».
источник