Как передать массив json объекта типа в класс контроллера MVC - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь пройти через массив JSON через мой контроллер.Я хочу иметь возможность отправлять данные в базу данных из массива JSON, который заполняется и передается в контроллер через JavaScript на стороне клиента.Тем не менее, он не получает ничего в контроллере.Мой контроллер получил нулевое значение в качестве параметра.

Мой контроллер:

  [HttpPost]
    [SiteAuthorize]
    public ActionResult SaveDashboard(List<Dashboard> dashboards)
    {
        try
        {

            string result = "";
            return Json(new { Result = result, Message = "" }, JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            return Json(new { Result = "Error", Message = ex.Message }, JsonRequestBehavior.AllowGet);
        }
    }

Мой javascript:

    var dashboards = {
    "DashboardName": '',
    "Width": '',
    "Height": '',
       "DashboardCell": [
           {
               "DashCellId": '',
               "x": '',
               "y": '',
               "DashWidth": '',
               "DashHeight": '',
               "colspan": '',
               "rowspan": '',
               "Active": '',
               "CellValue": '',
               "cellClass": '',
               "previousElementSibling": ''
           }
        ]
    };

    var tablestructure = $("#TableStructure").val();
    var savename = document.getElementById("namedash").value;

    var table = document.getElementById("table");
    var width = table.clientWidth;
    var height = table.clientHeight;
    var DashboardCell = [];
    dashboards.DashboardName = savename;
    dashboards.Width = width;
    dashboards.Height = height;
    for (var i = 0, row; row = table.rows[i]; i++)
    {

        //iterate through rows
        //rows would be accessed using the "row" variable assigned in the for loop
        for (var j = 0, col; col = row.cells[j]; j++)
        {
            for (var x = 0; x < col.attributes.length; x++)
            {
                if (col.attributes[x].localName == "colspan") {
                    var colspan = col.attributes[x].value;
                }
                else if (col.attributes[x].localName == "rowspan") {
                    var rowspan = col.attributes[x].value;
                }
                else if (col.attributes[x].localName == "class")
                {
                    var cellClass = col.attributes[x].value;
                }
            }

            var res = col.id.split(", ");
            var x = parseInt(res[0]);
            var y = parseInt(res[1]);
            var DashHeight = col.clientHeight;
            var DashWidth = col.clientWidth;
            if (j > 0) {
                var previousElementSibling = col.previousElementSibling.id;
            }
            else {
                var previousElementSibling = '';
            }
            var DashCellID = col.id;
            var CellValue = col.innerText;
            var DashCell = { DashCellId: DashCellID, x: x, y: y, DashWidth: DashWidth, DashHeight: DashHeight, colspan: colspan, rowspan: rowspan, Active: 1, CellValue: CellValue, cellClass: cellClass, previousElementSibling: previousElementSibling };
            DashboardCell.push(DashCell);

            //iterate through columns
            //columns would be accessed using the "col" variable assigned in the for loop
        }
    }
    dashboards.DashboardCell = DashboardCell;

    $.ajax({
        url: '/KPIReportAdmin/SaveDashboard',
        type: "POST",
        dataType: "json",
        contentType: "application/json",
        data: { dashboards: JSON.stringify(dashboards) },
        success: function (result)
        {

        },
        error: function (result) {
            alert("Failed");
        }

    });

Мой класс:

public class DashboardCell
{
    public int Width { get; set; }
    public int Height { get; set; }
    public bool Active { get; set; }
    public int colspan { get; set; }
    public int rowspan { get; set; }
    public int x { get; set; }
    public int y { get; set; }
    public string CellValue { get; set; }
    public string DashCellId { get; set; }
    public string cellClass { get; set; }
    public int previousElementSibling { get; set; }
}

public class Dashboard
{
    public string Name { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }
    public int UserID { get; set; }
    public List<DashboardCell> DashboardCell { get; set; }
}

Я ожидаю получить список приборной панели в SaveDashboard, но я получаю ноль

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Как я вижу, проблема в вашем файле JSON.В вашем JSON есть свойство с именем «DashboardName», где в API оно называется «Имя».Высота, Ширина, ИД пользователя - INT, но ваша передаваемая строка к нему.

попробуйте изменить свои значения, как показано ниже

var dashboards = {
    "Name": "",
    "Width": 0,
    "Height": 0,
    "UserID": 0,
    "DashboardCell": [
    {
      "Width": 0,
      "Height": 0,
      "Active": false,
      "colspan": 0,
      "rowspan": 0,
      "x": 0,
      "y": 0,
      "CellValue: "",
      "DashCellId: "",
      "cellClass: "",
      "previousElementSibling": 0
    }
  ]
};
0 голосов
/ 30 января 2019

Я также обнаружил, что в моем контроллере я проходил через список Dashboard, где мне нужно было только добавить Dashboard dashboards, поскольку этот список находится в классе Dashboard.

Также помогло то, что предложил Тецуя Ямамото.

Спасибо всем!

0 голосов
/ 30 января 2019

Существует два способа передать объект JS как коллекцию List<T> с использованием AJAX:

1) Поместите JSON.stringify с самим объектом и установите опцию traditional: true, должен быть установлен только один параметр:

$.ajax({
    url: '/KPIReportAdmin/SaveDashboard',
    type: "POST",
    dataType: "json",
    contentType: "application/json",
    traditional: true,
    data: JSON.stringify(dashboards),
    success: function (result)
    {

    },
    error: function (result) {
        alert("Failed");
    }
});

2) Передайте необработанный объект, не переводя его в строку, используя функцию $.param() с параметром traditional: true:

$.ajax({
    url: '/KPIReportAdmin/SaveDashboard',
    type: "POST",
    dataType: "json",
    data: $.param({ dashboards: dashboards }, true),
    success: function (result)
    {

    },
    error: function (result) {
        alert("Failed");
    }
});

Исключение произошло, поскольку вы передаетеОбъект JS, содержащий строку JSON с data: { dashboards: JSON.stringify(dashboards) } и метод действия контроллера, не знает, как преобразовать его в объект коллекции List<T> в качестве параметра.

Проблема, связанная с:

НедопустимоПримитив JSON: объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...