#c# #api #.net-core #routing #asp.net-core-2.0
#c# #API #.net-ядро #маршруты #asp.net-core-2.0
Вопрос:
Я создал api со следующим действием:
[HttpGet("GetStuff/{Name}")]
public ActionResult<string> GetStuff([FromRoute]GetStuffModel requestModel)
{
if (requestModel == null) return BadRequest();
var result = doStuff();
return Ok(result);
}
Модель выглядит следующим образом:
public class GetStuffModel
{
public string Name { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public double MyNumber { get; set; }
}
Теперь я использую swagger для тестирования этого, и в основном вышеупомянутое работает не так, как я думаю, должно. Что происходит, когда я отправляю запрос get с помощью swagger и смотрю на значения в модели, я обнаруживаю, что записывается только имя. Широта и долгота имеют значение 0. Однако, если я изменю модель на эту:
public class GetStuffModel
{
public string Name { get; set; }
[FromQuery]
public double Latitude { get; set; }
[FromQuery]
public double Longitude { get; set; }
public double MyNumber { get; set; }
}
Затем все записывается. Мой вопрос в том, почему я должен указывать, [FromQuery]
когда я уже объявил [FromRoute]
в контроллере?
Редактировать: я также добавил MyNumber
переменную, и она также загружается без необходимости [FromQuery]
Ответ №1:
Для [FromRoute]
модели атрибута binder пытается связать значения из данных маршрута запроса. При текущей настройке данные маршрута содержат только 1 значение для Name
(ну, там также есть значения action
и controller
, но сейчас это не имеет значения), поэтому можно привязать только Name
свойство GetStuffModel
(если вы добавите string Action
свойство в модель, вы увидите, что оно также будет привязано). Когда вы добавляете [FromQuery]
атрибут к свойствам модели, он переопределяет поведение привязки модели и позволяет привязывать определенные свойства из строки запроса. В этом случае swagger добавляет Latitude
и Longitude
в качестве параметров запроса, и привязка работает нормально.
Комментарии:
1. @Bojan Ну, у меня это не работает без
[FromQuery]
так что у вас должна быть какая-то дополнительная конфигурация, о которой я не знаю2. Я думаю, я понял, почему, и ваше объяснение имеет смысл.