Возвращает пользовательскую модель со списком моделей HttpGet

#c# #asp.net-core #xamarin #.net-core #asp.net-core-mvc

#c# #asp.net-ядро #xamarin #.net-ядро #asp.net-ядро-mvc #asp.net-core-mvc

Вопрос:

Вместо отправки нескольких запросов HttpGet для получения всех данных из БД, я хочу отправить один запрос и вернуть всю информацию. У меня есть, например, несколько моделей:

 public class Model1
{
    public int Id { get; set; }
    public string Address{ get; set; }
}

public class Model2
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Model3
    {
        public int Id { get; set; }
        public string Food{ get; set; }
    }
  

Мне нужно вернуть список этих моделей (List<Model1>, List<Model2>, List<Model3>) клиенту.

Я создаю новую модель

 public class Allinone
    {
    public List<Model1> Model1= new List<Model1>();
    public List<Model2> Model2= new List<Model2>();
    public List<Model3> Model3= new List<Model3>();
    }
  

В контроллере у меня есть это:

     [HttpGet("updateall")]
        public async Task<IActionResult> UpdateAll(int clientid)
        {
            Allinone model = new Allinone();
            
             model.model1 = db.where(....);
             model.model1 = db.where(....);
             model.model1 = db.where(....);


            return Ok(model);

        }
  

В режиме отладки я вижу, что модель правильно заполнена данными из базы данных, но на стороне клиента (в Postman и в клиентском приложении Xamarin) Я не могу прочитать содержимое. В postman я получаю только пустую строку {}.

В клиентском приложении Xamarin у меня те же модели, что и в asp net core, но содержимое пустое.

Ответ №1:

ИМХО, вам не нужно инициализировать list в вашем классе AllInOne, просто сделайте это так:

 public class AllInOne
    {
    public List<Model1> Models1 {get; set;}
    public List<Model2> Models2 {get; set;}
    public List<Model3> Models3 {get; set;}
    }
  

Попробуйте изменить подпись вашего действия на это:

         [Route("UpdateAll/{clientId}")]
        public async Task<ActionResult<AllInOne>> UpdateAll(int clientid)
  

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

1. Привет, Сергей, я попробовал, как вы предложили, просто вместо IActionResult я использовал ActionResult, потому что с IAction произошла некоторая ошибка, но все та же проблема, в результате я получаю только пустую строку {} .

2. Я внес некоторые изменения. Пожалуйста, попробуйте это в Postman для теста

3. Спасибо, что решили проблему очень быстро :). Проблема заключалась в неправильной инициализации списка. Я никогда не знаю, следует ли ее инициализировать или нет. После того, как я изменил, как вы предложили, теперь он работает (он также работает с [httpget («updateall»)] .)

4. Спасибо за отзыв. Я рад, что смог вам помочь.