为什么需要 [FromQuery] 属性?

Why is [FromQuery] attribute required?

我使用以下操作创建了一个 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 请求并查看模型中的值时,会发生什么情况,我发现只捕获了 Name。纬度和经度的值为 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; }
}

然后一切都被捕获了。我的问题是当我已经在控制器中声明了 [FromRoute] 时,为什么还要指定 [FromQuery]

编辑:我还添加了 MyNumber 变量,并且不需要 [FromQuery]

对于 [FromRoute] 属性模型绑定器尝试绑定来自请求路由数据的值。当前的设置路由数据只包含 Name 的 1 个值(好吧,那里还有 actioncontroller 值,但现在没关系)所以可以只绑定 Name 属性 of GetStuffModel(如果您将 string Action 属性 添加到模型中,您会看到它也会被绑定)。当您将 [FromQuery] 属性添加到模型属性时,它会覆盖模型绑定行为并允许从查询字符串绑定某些属性。在这种情况下,swagger 添加 LatitudeLongitude 作为查询参数并且绑定工作正常。