为什么需要[FromQuery]属性?

时间:2019-03-16 15:15:49

标签: c# api .net-core routing 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; }
}

现在我正在使用摇摇欲坠来测试它,基本上上面的方法不起作用,正如我认为的那样。发生的事情是,当我大张旗鼓地提交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; }
}

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

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

1 个答案:

答案 0 :(得分:1)

对于[FromRoute]属性模型,绑定程序尝试绑定请求路由数据中的值。使用当前的设置路由,数据仅包含Name的1个值(嗯,那里还有actioncontroller的值,但现在都没有关系),因此可以仅绑定{ Name的{​​1}}属性(如果您将GetStuffModel属性添加到模型中,则会看到它也将被绑定)。当您将string Action属性添加到模型属性时,它会覆盖模型绑定行为,并允许从查询字符串中绑定某些属性。在这种情况下,昂首阔步地将[FromQuery]Latitude添加为查询参数,并且绑定工作正常。