Значения меток, возвращаемые API

77
2

Этот метод возвращает bool и string -

public (bool active, string name) Report() 
{
}

С моего контроллера я называю это так:

public IActionResult Credit([FromBody] Data data)
{
return Ok(Report())
}

Ответ, который я получаю, это что-то вроде этого -

{
"item1": false,
"item2": "Your name"
}

Как я получу этот ответ -

{
"Active": false,
"Name": "Your name"
}

спросил(а) 2021-01-19T18:43:39+03:00 6 месяцев назад
1
Решение
125

Быстрый и простой способ - вернуть анонимный тип, взяв значения из возвращаемого кортежа

public IActionResult Credit([FromBody] Data data) 
{
//...
var report = Report();
return Ok(new
{
Active = report.active,
Name = report.name
})
}

В идеале вы должны вернуть строго типизированную модель, которая может быть возвращена из API

public class ReportModel 
{
public string Name { get;set; }
public bool Active { get;set; }
}

и соответственно обновить

public ReportModel Report()  
{
//...
}

public IActionResult Credit([FromBody] Data data)
{
//...
var report = Report();
return Ok(report);
}

ответил(а) 2021-01-19T18:43:39+03:00 6 месяцев назад
63

Корневые значения (как вы используете для возврата из метода Report()) - это просто синтаксический сахар вокруг ValueTuple<T,T,...,T>. Поэтому имена реальных объектов не являются active и name но, фактически, item1 и item2.

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

[return: TupleElementNames(new string[] {
"active",
"name"
})]
public ValueTuple<bool, string> Report()

Как вы разрешаете это? Вы должны создать модель, которая отражает то, что вы хотите вернуть:

public class ActiveName
{
public string Name { get;set;}
public bool Active {get;set;}
}

а затем измените свой метод, чтобы вернуть этот тип ActiveName.

Еще один способ - вернуть анонимный тип как динамический, но я рекомендую против этого подхода, так как использование dynamic значений создает вероятность ошибок во время выполнения, если сделаны ошибки. Если вы просто используете его для возврата из вашего метода API, то это, вероятно, ОК.

public dynamic Report()
{
return new { name = "abc", active = true };
}

ответил(а) 2021-01-19T18:43:39+03:00 6 месяцев назад
46

public IActionResult Credit([FromBody] Data data)
{
var x = Report();
return Ok(new {Active = x.Item1, UserName = x.Item2});
}

ответил(а) 2021-01-19T18:43:39+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема