Nizar Belhiba Ответов: 2

Asp.net ядро, передающее массив объектов контроллеру


Привет,

Мне нужно передать массив объектов из Jquery в мой HomeController

Я перепробовал все, но безрезультатно, метод в контроллере вызывается, но предполагаемый переданный список пуст.

Что я уже пробовал:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<script>.
.
.
.

var canvasField = {
            id: cStep,
            recStartx: last_mousex,
            recStarty: last_mousey,
            recWidth: width,
            recHeight: height
        };
var canvasFields = new Array();
canvasFields.push(canvasField);

var myJsonString = JSON.stringify(canvasFields);  //only for test

$('#btnClick').click(function (e) {
            $.ajax({
                url: "@Url.Action("GetCanvasFields")",
                type: 'post',
                contentType: 'application/json',
                data: JSON.stringify(canvasFields),
                success: function () {
                    alert("yes");
                },
                error: function (errMsg) {
                    alert(errMsg);
                }
            })
        });
</script>



сначала я проверил, правильно ли заполнен массив "canvasFields", поэтому я преобразовал его в строку Json и поместил в предупреждение, и результат был в порядке


к сожалению, даже думал, что метод "GetCanvasFields" будет вызван, но мой список остается пустым
мой домашний контролер:
[HttpPost]
        public ActionResult GetCanvasFields([FromBody] List<CanvasField> canvasFields)
        {
            return Json(new
            {
                resut = "OK"
            });
        }

 public class CanvasField
    {
        public int Id { get; set; }
        public int RecStartx { get; set; }
        public int RecStarty { get; set; }
        public int RecWidth { get; set; }
        public int RecHeight { get; set; }
    }

Maciej Los

Вы заявили, что проверяли RecLists вместо canvasField- Вы можете это проверить?

F-ES Sitecore

Ваша функция принимает параметр под названием "canvasFields"

public ActionResult GetCanvasFields([FromBody] List<canvasfield> canvasFields)

но ваш js проходит мимо canvasField

данные: { canvasField: canvasField },

Эти два имени должны совпадать. Вполне могут быть и другие проблемы, google для передачи списков контроллерам, это очень хорошо документировано.

Nizar Belhiba

Извините @F-ES Sitecore я обновляю код
Я попробовал в своем клике Funktion с $('#btnClick').нажмите кнопку(функция (e) {

canvasFields = [{
id: 1,
recStartx: 2,
recStarty: 3,
ширина рек: 4,
recHeight: 5
},
{
id: 2,
recStartx: 2,
recStarty: 3,
ширина рек: 4,
recHeight: 5
}];


$.Аякс({
URL-адрес: "@URL-адрес.Действий("GetCanvasFields")",
тип: "почта",
contentType: 'application/json',
сведения: в формате JSON.преобразовать в строки(canvasFields),
успех: функция () {
тревога("да");
},
ошибка: функция (errMsg) {
уведомление(сообщение об ошибке);
}
})
});

и здесь это действительно сработало, но как только я сохраняю canvasFields.push(canvasField); я получаю результат null

2 Ответов

Рейтинг:
6

Nizar Belhiba

baaaaaaahhhhhhhhh Soooooorrrrry
Проблема была полностью на неправильной стороне ... ничего с моим сценарием или моим контроллером.
проблема была в модели
как я уже упоминал в комментарии, я попробовал с

$('#btnClick').click(function (e) {

canvasFields = [{
                  id: 1,
                  recStartx: 2,
                  recStarty: 3,
                  recWidth: 4,
                  recHeight: 5
                },
                {
                  id: 2,
                  recStartx: 2,
                  recStarty: 3,
                  recWidth: 4,
                  recHeight: 5
               }];

$.ajax({
url: "@Url.Action("GetCanvasFields")",
type: 'post',
contentType: 'application/json',
data: JSON.stringify(canvasFields),
success: function () {
alert("yes");
},
error: function (errMsg) {
alert(errMsg);
}
})
});


и когда я проверил фактическую строку json по
myJsonString = JSON.stringify(canvasFields);

а затем сравните его используя тот же шаг с моими динамическими заполненными canvasFields
Я выяснил, что значения в моей строке json относятся к типу float, и моя модель была настроена на принятие int.

так что изменив мою модель на двойную все сработало:
public class CanvasField
   {
       public double Id { get; set; }
       public double RecStartx { get; set; }
       public double RecStarty { get; set; }
       public double RecWidth { get; set; }
       public double RecHeight { get; set; }
   }


Рейтинг:
2

MadMyche

На стороне клиента лучше всего отправлять данные в формате JSON, который вы определили как типы данных и контента.

На стороне сервера вы не получаете коллекцию объектов. Вы на самом деле получаете строку JSON.
Что вам нужно сделать, заключается в том, чтобы десериализовать эту строку в свой список.

У Microsoft есть довольно хорошая документация и примеры для начала работы:
Как сериализовать и десериализовать JSON с помощью C# - .NET | Microsoft Docs[^]


Nizar Belhiba

к сожалению, это не было проблемой, я знаю, как сериализовать и десериализовать строку/файл json в c#. Даже если я изменю свой метод, чтобы получить строку, она все равно будет пустой.