Каков правильный синтаксис для сериализации углового KeyValue в ASP.NET KeyValuePair?

Я пытался сериализовать «массив» KeyValue, чтобы отправить его через PUT через http на мой веб-сервер asp.net.

Функция в Angular выглядит так:

SortAboutUs(data : KeyValue<number,number>[]) {
    this.dataTransmitter.Put(this.apiUrl+'/api/aboutus/sort', data);    
}

и если я отлаживаю следующий контейнер данных, это выглядит так:

Контейнер данных

У меня есть следующее в моем контроллере веб-сервера .net core.

[HttpPut("[action]")]
public ActionResult<bool> Sort(IList<KeyValuePair<int, int>> dto)
{
    return Ok(_aboutUsService.Sort(dto));
}

Однако я получаю следующую ошибку при попытке отправить его через PUT:

The JSON value could not be converted to System.Collections.Generic.List`1[System.Collections.Generic.KeyValuePair`2[System.Int32,System.Int32]]. Path: $[0] | LineNumber: 0 | BytePositionInLine: 8.

Странно то, что я уже использовал ту же технику в другой старой версии ядра .net, и там все работает.

Я также заметил, что начиная с .net core 3.1 KeyValue в C# изменилось на KeyValuePair, но в более старых версиях .net core это было KeyValue.

Это должно что-то делать с моей связанной ошибкой?

И как я могу сериализовать KeyValue из Angular, чтобы мой веб-сервер мог его прочитать?


person Fy Z1K    schedule 18.06.2020    source источник


Ответы (2)


Ваш объект должен выглядеть так: -

[
 {
   4: 0
 },
 {
   5: 1
 },
 {
   6: 2
 }
]
person Aakash Garg    schedule 18.06.2020
comment
Я изменил объект, как вы предложили, но все равно получаю ту же ошибку. Каково объявление типа этого объекта в параметре методов контроллера? - person Fy Z1K; 18.06.2020
comment
эй, извините, ваш старый формат работает нормально, но следует ли вам использовать словарь вместо пары ключ-значение в .net? - person Aakash Garg; 18.06.2020
comment
Спасибо за ваш ответ. Раньше я пытался использовать IDictionary‹int,int›, но получил сообщение об ошибке, что словарь не поддерживается по какой-либо причине. Странно то, что этот же метод с IList‹KeyValuePair‹int,int›› работал в более старой версии (v2.2) .netcore, но, похоже, отказывается работать, начиная с .net core 3.1. - person Fy Z1K; 18.06.2020
comment
напишите собственный преобразователь, как указано здесь: - stackoverflow.com/questions /21021655/ - person Aakash Garg; 18.06.2020

Я смог решить проблему, создав свой собственный класс KeyValue следующим образом:

public class KeyValue<K,V>
{
    public K Key { get; set; }
    public V Value { get; set; }
}

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

[HttpPut("[action]")]
public ActionResult<bool> Sort([FromBody] IList<KeyValue<int, int>> dto)
{
    return Ok(_aboutUsService.Sort(dto));
}

Благодаря этому подходу контроллер смог получить отправленный массив KeyValue через PUT из Angular на мой веб-сервер... введите здесь описание изображения

person Fy Z1K    schedule 18.06.2020