Передача списка объектов в MVC-контроллер с использованием jQuery Ajax
Я пытаюсь передать массив объектов в метод MVC-контроллера, используя
Функция jQuery ajax(). Когда я вхожу в метод контроллера PassThing() С#
аргумент "вещи" имеет значение null. Я пробовал это, используя тип List for
аргумент, но это тоже не работает. Что я делаю неправильно?
<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; }
}
}
Ответы
Ответ 1
Используя предложение NickW, я смог заставить это работать, используя things = JSON.stringify({ 'things': things });
. Вот полный код.
$(document).ready(function () {
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
things = JSON.stringify({ 'things': things });
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: 'POST',
url: '/Home/PassThings',
data: things,
success: function () {
$('#result').html('"PassThings()" successfully called.');
},
failure: function (response) {
$('#result').html(response);
}
});
});
public void PassThings(List<Thing> things)
{
var t = things;
}
public class Thing
{
public int Id { get; set; }
public string Color { get; set; }
}
Из этого я узнал две вещи:
Настройки contentType и dataType абсолютно необходимы в функции ajax(). Это не будет работать, если они отсутствуют. Я узнал об этом после долгих проб и ошибок.
Чтобы передать массив объектов методу контроллера MVC, просто используйте формат JSON.stringify({'things': things}).
Я надеюсь, что это помогает кому-то еще!
Ответ 2
Не могли бы вы просто сделать это?
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
$.post('@Url.Action("PassThings")', { things: things },
function () {
$('#result').html('"PassThings()" successfully called.');
});
... и отметьте свое действие с помощью
[HttpPost]
public void PassThings(IEnumerable<Thing> things)
{
// do stuff with things here...
}
Ответ 3
Форматирование данных, которые могут быть проблемой. Попробуйте выполнить одно из следующих действий:
data: '{ "things":' + JSON.stringify(things) + '}',
Или (from Как отправить массив строк в ASP.NET MVC Controller без формы?)
var postData = { things: things };
...
data = postData
Ответ 4
Я использую веб-приложение .Net Core 2.1 и не смог получить ни одного ответа. Я либо получил пустой параметр (если метод был вызван вообще), либо ошибка сервера 500. Я начал играть со всеми возможными комбинациями ответов и, наконец, получил рабочий результат.
В моем случае решение было следующим:
Скрипт - приведение в соответствие исходного массива (без использования именованного свойства)
$.ajax({
type: 'POST',
contentType: 'application/json; charset=utf-8',
url: mycontrolleraction,
data: JSON.stringify(things)
});
А в методе контроллера используйте [FromBody]
[HttpPost]
public IActionResult NewBranch([FromBody]IEnumerable<Thing> things)
{
return Ok();
}
К ошибкам относятся:
Примечания
dataType
не нужен, несмотря на то, что говорится в некоторых ответах, так как он используется для декодирования ответов (поэтому здесь не относится к примерам запросов).
List<Thing>
также работает в методе контроллера
Ответ 5
У меня есть отличный ответ для всего этого: я пробовал так много решений, которые не смогли получить, наконец, я смог управлять, пожалуйста, найдите подробный ответ ниже:
$.ajax({
traditional: true,
url: "/Conroller/MethodTest",
type: "POST",
contentType: "application/json; charset=utf-8",
data:JSON.stringify(
[
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
]),
success: function (data) {
$scope.DisplayError(data.requestStatus);
}
});
Controler
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
public JsonResult MethodTest(IEnumerable<Thing> datav)
{
//now datav is having all your values
}
Ответ 6
Единственный способ заставить это работать - передать JSON в виде строки, а затем десериализовать его с помощью JavaScriptSerializer.Deserialize<T>(string input)
, что довольно странно, если этот десериализатор по умолчанию для MVC 4.
Моя модель имеет вложенные списки объектов, и лучшее, что я могу получить с использованием данных JSON, - это самый верхний список, в котором есть правильное количество элементов, но все поля в элементах были пустыми.
Это не должно быть так сложно.
$.ajax({
type: 'POST',
url: '/Agri/Map/SaveSelfValuation',
data: { json: JSON.stringify(model) },
dataType: 'text',
success: function (data) {
[HttpPost]
public JsonResult DoSomething(string json)
{
var model = new JavaScriptSerializer().Deserialize<Valuation>(json);
Ответ 7
Это рабочий код для вашего запроса, вы можете его использовать.
Controler
[HttpPost]
public ActionResult save(List<ListName> listObject)
{
//operation return
Json(new { istObject }, JsonRequestBehavior.AllowGet); }
}
Javascript
$("#btnSubmit").click(function () {
var myColumnDefs = [];
$('input[type=checkbox]').each(function () {
if (this.checked) {
myColumnDefs.push({ 'Status': true, 'ID': $(this).data('id') })
} else {
myColumnDefs.push({ 'Status': false, 'ID': $(this).data('id') })
}
});
var data1 = { 'listObject': myColumnDefs};
var data = JSON.stringify(data1)
$.ajax({
type: 'post',
url: '/Controller/action',
data:data ,
contentType: 'application/json; charset=utf-8',
success: function (response) {
//do your actions
},
error: function (response) {
alert("error occured");
}
});
Ответ 8
var List = @Html.Raw(Json.Encode(Model));
$.ajax({
type: 'post',
url: '/Controller/action',
data:JSON.stringify({ 'item': List}),
contentType: 'application/json; charset=utf-8',
success: function (response) {
//do your actions
},
error: function (response) {
alert("error occured");
}
});
Ответ 9
Если вы используете ASP.NET Web API, вам нужно просто передать data: JSON.stringify(things)
.
И ваш контроллер должен выглядеть примерно так:
public class PassThingsController : ApiController
{
public HttpResponseMessage Post(List<Thing> things)
{
// code
}
}
Ответ 10
Модификация из @veeresh i
var data=[
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
]; //parameter
var para={};
para.datav=data; //datav from View
$.ajax({
traditional: true,
url: "/Conroller/MethodTest",
type: "POST",
contentType: "application/json; charset=utf-8",
data:para,
success: function (data) {
$scope.DisplayError(data.requestStatus);
}
});
In MVC
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
public JsonResult MethodTest(IEnumerable<Thing> datav)
{
//now datav is having all your values
}
Ответ 11
Завершает ваш список объектов с другим объектом, содержащим свойство, которое соответствует имени параметра, ожидаемого контроллером MVC.
Важным битом является обертка вокруг списка объектов.
$(document).ready(function () {
var employeeList = [
{ id: 1, name: 'Bob' },
{ id: 2, name: 'John' },
{ id: 3, name: 'Tom' }
];
var Employees = {
EmployeeList: employeeList
}
$.ajax({
dataType: 'json',
type: 'POST',
url: '/Employees/Process',
data: Employees,
success: function () {
$('#InfoPanel').html('It worked!');
},
failure: function (response) {
$('#InfoPanel').html(response);
}
});
});
public void Process(List<Employee> EmployeeList)
{
var emps = EmployeeList;
}
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}