Значения меток, возвращаемые API
Этот метод возвращает 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"
}
Быстрый и простой способ - вернуть анонимный тип, взяв значения из возвращаемого кортежа
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);
}
Корневые значения (как вы используете для возврата из метода 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 };
}
public IActionResult Credit([FromBody] Data data)
{
var x = Report();
return Ok(new {Active = x.Item1, UserName = x.Item2});
}