ASP. NET MVC Ошибка кодовой модели с корпусом Json - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь получить JQuery. ajax запись массива Json для привязки с ASP. NET Core MVC Controller Action и не могу получить привязку модели к работа.

Проблема ниже по потоку, но я включаю ее для полноты.

$.ajax({
    url: "/Campaign/RosterMaintenanceAttribute",
    type: "post",
    data: JSON.stringify(attributeData),
    contentType: 'application/json; charset=utf-8',
    success: function (result) {
        alert(result);
    },
    error: function (request) {
        alert(request);
    }
});

Вот как выглядит исходящий запрос в браузере:

enter image description here

Вот как выглядит полезная нагрузка (для ясности я расширил один из элементов массива):

enter image description here

Вот как выглядит подпись действия контроллера:

public IActionResult RosterMaintenanceAttribute([FromBody] IEnumerable<AttributeModel> attributes)

Я пытался использовать параметр в виде строки, но независимо от того, какой тип данных я использую, параметр разрешается в ноль. Для ясности, это контроллер MVC, а не контроллер Api, и я не уверен, что [FromBody] работает в контроллерах MVC.

Класс AttributeModel выглядит следующим образом:

public class AttributeModel
{
    public Guid CharacterAttributeId { get; set; }
    public Guid CharacterId { get; set; }

    public Guid AttributeTypeId { get; set; }
    public string AttributeName { get; set; }
    public string AttributeValue { get; set; }
    public int AttributeModifier { get; set; }
    public string AttributeNote { get; set; }
    public int AttributeOrdinal { get; set; }
    public bool Proficient { get; set; }
}

Так выглядит полезная нагрузка с синтаксисом .attributes enter image description here

Так выглядит запрос внутри контроллера enter image description here

1 Ответ

0 голосов
/ 07 февраля 2020

Проблема связана с типами данных полей. Кажется, что модель не любит отображать целые и логические значения - хотя с Guides все в порядке (это те 3, с которыми мне приходится иметь дело, не уверенные в других). Я проверил, что попытка сопоставить с int или bool вызывает сбой привязки.

Я решил отправить массив без элемента root

data: JSON.stringify(attributeData.attributes)

Я использовал отличный инструмент (окрик http://json2csharp.com/) и просто вставил в тело, которое у меня есть в запросе браузера, сгенерировав это:

public class httpAttributeModel
{
    public string CharacterAttributeId { get; set; }
    public string CharacterId { get; set; }
    public string AttributeTypeId { get; set; }
    public string AttributeOrdinal { get; set; }
    public string AttributeName { get; set; }
    public string AttributeValue { get; set; }
    public string AttributeModifier { get; set; }
    public string Proficient { get; set; }
    public string AttributeNote { get; set; }
}

С эта подпись контроллера:

public IActionResult RosterMaintenanceAttribute([FromBody] List<httpAttributeModel> attributes)

Это работает. Итак, я начал настраивать типы данных, чтобы попытаться сопоставить исходную модель, которую я использовал для получения полезной нагрузки, и увидеть, где она не удалась. Фактические значения для int и bool действительны для типа (за исключением кавычек вокруг них из stringify), но здесь все перестает работать. Я не знаю, есть ли что-то, что можно сделать на стороне клиента, чтобы обозначить тип данных, или, что более вероятно, что-то на стороне сервера, которое помогает связующему модели? Для этой проблемы это достаточно хорошо, я могу преобразовать значения int и bool, как только я нахожусь в Контроллере.

В моем окончательном решении, в модели выше, у меня есть первые три поля, установленные как Guids и остальное как есть.

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