Вложенные коллекции (Dictionary<int, List>) не передаются должным образом в строку запроса

#asp.net-core #asp.net-core-mvc #viewmodel #query-string #.net-5

#asp.net-core #asp.net-core-mvc #viewmodel #строка запроса #.net-5

Вопрос:

У меня есть действие post, которое в случае успеха заполняет новую модель представления : ConfirmationViewModel.cs . Эта модель представления содержит вызываемое свойство Wings , которое представляет собой не что иное, как словарь с int типом ключа и List<string> значением. После успешной передачи требуемых данных в эту модель представления действие перенаправляется на другое действие, передавая вместе с ним модель представления.

Однако, как вы можете видеть на изображении ниже, словарь не будет успешно заполнен в следующем запросе. Поэтому я подозревал, что что-то пошло не так в процессе привязки параметров строки запроса к модели представления.

Отладочная информация

Однако строка запроса показала реальную проблему:

 https://localhost:44341/ShipRegistration/Confirmation?Hull=Neptunusamp;Engine=Galaxy Classamp;Wings=[1, System.Collections.Generic.List`1[System.String]]amp;Wings=[2, System.Collections.Generic.List`1[System.String]]amp;TotalWeight=908amp;TotalEnergy=186
 

, или URL-расшифрованный:

 https://localhost:44341/ShipRegistration/Confirmation?Hull=Neptunusamp;Engine=Galaxy Classamp;Wings=[1, System.Collections.Generic.List`1[System.String]]amp;Wings=[2, System.Collections.Generic.List`1[System.String]]amp;TotalWeight=908amp;TotalEnergy=186
 

Каким-то образом значение вложенной коллекции неправильно передается в строку запроса. Вместо этого передается только тип объекта ( System.Collections.Generic.List ).

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

Надеюсь, кто-нибудь сможет мне в этом помочь.

Заранее спасибо,

Райан

Комментарии:

1. Полезен ли мой ответ?

Ответ №1:

Вот демонстрация для передачи словаря в строке запроса:

Контроллер:

 public IActionResult TestDictionary(ConfirmationViewModel c) 
        {
            return Ok();
        }
 

ConfirmationViewModel :

 public class ConfirmationViewModel
    {
        public Dictionary<int, List<string>> Wings { get; set; }
        public string Engine { get; set; }
        public string Hull { get; set; }
        public int TotalEnergy { get; set; }
        public int TotalWeight { get; set; }

    }
 

Url:

 https://localhost:xxx/xxx/xxx?Hull=Neptunusamp;Engine=Galaxy Classamp;TotalWeight=908amp;TotalEnergy=186amp;Wings.1=samp;Wings.1=ssamp;Wings.2=ramp;Wings.2=rr
 

Результат:
введите описание изображения здесь

Вы также можете использовать url, подобный этому:

 https://localhost:xxx/xxx/xxx?Hull=Neptunusamp;Engine=Galaxy Classamp;TotalWeight=908amp;TotalEnergy=186amp;Wings[1]=samp;Wings[1]=ssamp;Wings[2]=ramp;Wings[2]=rr
 

или

 https://localhost:xxx/xxx/xxx?Hull=Neptunusamp;Engine=Galaxy Classamp;TotalWeight=908amp;TotalEnergy=186amp;Wings[1][0]=samp;Wings[1][1]=ssamp;Wings[2][0]=ramp;Wings[2][1]=rr
 

Комментарии:

1. Боюсь, что нет. Вы указали, как должен выглядеть URL-адрес, но не обязательно, как его достичь. Тем временем я нашел обходной путь: я мог бы просто отобразить представление, фактически не отправляя новый запрос. Спасибо за ваше время и усилия и мои извинения за поздний ответ.