Зачем нужен атрибут [FromQuery]? - PullRequest
0 голосов
/ 16 марта 2019

Я создал 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 и смотрю на значения в модели, я обнаруживаю, что захватывается только имя. Широта и Долгота имеют значение 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 Ответ

1 голос
/ 16 марта 2019

Для [FromRoute] связыватель модели атрибута пытается связать значения из данных запроса маршрута. При текущей настройке данные маршрута содержат только 1 значение для Name (ну, там также есть значения action и controller, но это не имеет значения), поэтому можно связать только свойство Name из GetStuffModel (если вы добавите свойство string Action в модель, вы увидите, что оно также будет связано). Когда вы добавляете атрибут [FromQuery] к свойствам модели, он переопределяет поведение привязки модели и позволяет привязывать определенные свойства из строки запроса. В этом случае swagger добавляет Latitude и Longitude в качестве параметров запроса, и привязка работает нормально.

...