Ошибка POST 500 при отправке объекта JSON в формате JSON в контроллер - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время я работаю над веб-приложением ASP.net с шаблоном MVC.Я создал страницу, на которой люди могут добавлять элементы в раздел сетки и перетаскивать их (Gridstack - это плагин для создания перетаскиваемых блоков / объектов).Моя цель - отправить окончательные координаты этих блоков на мой контроллер:

function saveData() {
    var pagePositions = [];

    // Fill our array
    $('.grid-stack-item.ui-draggable').each(function () {
        var $this = $(this);
        pagePositions.push({
            x: $this.attr('data-gs-x'),
            y: $this.attr('data-gs-y'),
            w: $this.attr('data-gs-width'),
            h: $this.attr('data-gs-height'),
            content: $('.grid-stack-item-content', $this).html()
        });
    });

    // Convert array to object
    var pagePosData = toObject(pagePositions);

    alert(pagePosData);

    $.ajax({
        type: "POST",
        url: "savePage",
        data: { positions: JSON.stringify(pagePosData) }
    });

} function toObject(arr) {
    var rv = {};
    for (var i = 0; i < arr.length; ++i)
        if (arr[i] !== undefined) rv[i] = arr[i];
    return rv;
}

Приведенный выше код заполняет атрибуты заданных элементов HTML и помещает их в массив.Согласно нескольким темам в Интернете, я предполагал, что отправка массива вызывает проблемы, поэтому я вставил функцию, которая преобразует массив в объект javascript (пары ключ-значение).Я отправляю их своему контроллеру с помощью вызова AJAX, который приводит к коду ошибки 500:

    [HttpPost]
    public string savePage(string positions)
    {
        //some code
        var json = positions;
        var test = "";
        CreatePagemodelJson obj = new JavaScriptSerializer().Deserialize<CreatePagemodelJson>(positions.ToString());
        //var jsonObject = JsonConvert.DeserializeObject<CreatePagemodel>(positionsJson.ToString());

        return "";
    }

Я устанавливаю точки останова внутри контроллера, чтобы прочитать значение, которое я получаю из позиций параметров, но это не такдаже добраться до этого момента.Я попытался настроить модели для файла Json, но проблема здесь в том, что почтовые вызовы возвращают динамический формат JSON.

Обновление: Мне удалось заставить его работать с сообщениями ниже.С нижеприведенной структурой я получаю результаты в виде массива в соответствии с моей моделью.

function saveData() {
    var pagePositions = [];

    // Fill our array
    $('.grid-stack-item.ui-draggable').each(function () {
        var $this = $(this);
        pagePositions.push({
            x: $this.attr('data-gs-x'),
            y: $this.attr('data-gs-y'),
            w: $this.attr('data-gs-width'),
            h: $this.attr('data-gs-height'),
            content: $('.grid-stack-item-content', $this).html()
        });
    });

    alert(pagePositions);

    $.ajax({
        type: "POST",
        url: "savePage",
        contentType: 'application/json',
        data: JSON.stringify(pagePositions)
    });
}

public class Position
{
    public string x { get; set; }
    public string y { get; set; }
    public string w { get; set; }
    public string h { get; set; }
    public string content { get; set; }
}

[HttpPost]
public ActionResult savePage(IEnumerable<Position> positions)
{
    //some code
    return View("SomeView");
}

Параметр position успешно возвращает массив отправленных страницей pagePositions с сообщением: Succesfull transfer

Я попытался отправить данные без JSON.stringify (pagePositions) и ContentType: 'application / json', но я получил нулевой возврат в своем параметре на контроллере.

1 Ответ

0 голосов
/ 23 мая 2018

Здесь можно указать несколько вещей.

С вашим текущим вопросом.

  • Отправляемые вами данные не являются строкой.data: { positions: JSON.stringify(pagePosData) } создает объект JavaScript со свойством positions, значением которого является сериализованная версия вашего объекта.
  • Вы должны иметь возможность создать класс ac # и принять его в качестве методов контроллераПараметр и приблизьтесь к ожидаемым результатам.Это будет выглядеть следующим образом:

    public class Foo {public string Positions {get;задавать;}}

    открытая строка savePage (Foo позиции)

  • В качестве альтернативы вы можете обновить свой метод, чтобы получить тело запроса в виде строки, как показано в этого ответа SO

Что еще более важно, может показаться, что вы столкнулись с некоторой дезинформацией.Не должно быть проблем с передачей массива обратно на ваш контроллер.Опять же, вам понадобится класс ac #, который моделирует ваши ожидаемые типы данных.Вы не перечислите их в своем вопросе, поэтому трудно сказать наверняка, как вам нужно обновить код, но я бы предложил что-то более похожее на следующее:

function saveData() {
    var pagePositions = [];

    // Fill our array
    $('.grid-stack-item.ui-draggable').each(function () {
        var $this = $(this);
        pagePositions.push({
            x: $this.attr('data-gs-x'),
            y: $this.attr('data-gs-y'),
            w: $this.attr('data-gs-width'),
            h: $this.attr('data-gs-height'),
            content: $('.grid-stack-item-content', $this).html()
        });
    });

    $.ajax({
        type: "POST",
        url: "savePage",
        data: JSON.stringify(pagePositions),
        contentType: "application/json"
    });
}


public class Position
{
  public int X { get; set; }
  public int Y { get; set; }
  public int W { get; set; }
  public int H { get; set; }
  public string Content { get; set; }
}

[HttpPost]
public string savePage(Position[] positions)
{
    //some code
    return "";
}

Если это не такработать, пожалуйста, предоставьте более подробную информацию о том, что не работает, какую ошибку вы получаете и какую версию asp.net mvc вы используете.

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