Передача списка объектов в 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; }
}

Из этого я узнал две вещи:

  1. Настройки contentType и dataType абсолютно необходимы в функции ajax(). Это не будет работать, если они отсутствуют. Я узнал об этом после долгих проб и ошибок.

  2. Чтобы передать массив объектов методу контроллера 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...
}

Ответ 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();
    }

К ошибкам относятся:

  • Наименование контента

    данные: {содержимое: узлы},//ошибка сервера 500

  • Отсутствует contentType = ошибка сервера 500

Примечания

  • 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; }
}