Устранение проблем с привязкой модели в ASP. NET Core 3.1 API - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь отправить объект с помощью запроса POST на свой ASP. NET Core 3.1 API, но продолжаю получать ошибку Bad Request. Насколько я понимаю, у меня есть класс, который соответствует тому, что я ожидаю идеально , но, очевидно, это не так. Как я могу точно определить, в чем проблема?

Ошибка:

public async Task<IActionResult> Post([FromBody] MyCustomObject input)
{
   // Do something here...
}

Если я использую dynamic, все работает нормально. Итак, следующий код работает нормально:

public async Task<IActionResult> Post([FromBody] dynamic input)
{
   // Do something here...
}

Как я уже сказал, я получаю сообщение об ошибке 400, Bad Request. Я перебирал MyCustomObject снова и снова, и он выглядит идентичным объекту, который я отправляю.

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

public class CreateContactVm
{
    [GuidEmptyNotAllowed]
    public Guid AccountId { get; set; }

    [Required]
    public string AccountName { get; set; }

    [GuidEmptyNotAllowed]
    public Guid ContactGroupId { get; set; }

    [IntZeroNotAllowed]
    public int ContactType { get; set; }

    public string FirstName { get; set; }

    public string MiddleName { get; set; }

    public string LastName { get; set; }

    public string EntityName { get; set; }

    public List<AddEmailVm> Emails { get; set; } = new List<AddEmailVm>();

    public List<AddPhoneNumberVm> PhoneNumbers { get; set; } = new List<AddPhoneNumberVm>();

    public List<AddAddressVm> Locations { get; set; } = new List<AddAddressVm>();
}

Здесь я использую некоторые пользовательские проверки, такие как [GuidEmptyNotAllowed] или [IntZeroNotAllowed]. Я проверяю объект, который я отправляю с помощью моего вызова POST, и он удовлетворяет ВСЕМ требованиям, но все равно не работает.

Как я могу получить дополнительную информацию о том, почему мой метод API выдает ошибку 400?

ОБНОВЛЕНИЕ:

Следующий код позволяет мне преобразовать то, что входит как dynamic, в мой CreateContactVm пользовательский класс, но мне вообще не нужно этого делать:

CreateContactVm request = new CreateContactVm();

try
{
    var element = (JsonElement)input; // input is the dynamic received
    request = JsonUtils.Deserialize<CreateContactVm>(element.GetRawText());
}
catch(Exception e)
{
    var error = e.Message;
}

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

...