Почему требуется атрибут [FromQuery]?

#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. Я думаю, я понял, почему, и ваше объяснение имеет смысл.