代码之家  ›  专栏  ›  技术社区  ›  Bagzli

为什么需要[FromQuery]属性?

  •  0
  • Bagzli  · 技术社区  · 6 年前

    我通过以下操作创建了一个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请求并查看模型中的值时,会发现只捕获了名称。纬度和经度的值为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 变量,而这个变量也不需要 [来自查询]

    0 回复  |  直到 6 年前
        1
  •  1
  •   Alexander    6 年前

    为了 [FromRoute] 属性模型绑定器尝试绑定来自请求路由数据的值。对于当前设置,路由数据仅包含1个值 Name (嗯,还有 action controller 值在那里,但现在不重要),因此只能绑定 名字 的属性 GetStuffModel (如果您添加 string Action 属性到模型,您将看到它也将被绑定)。当你添加 [FromQuery] 属性到模型属性它覆盖模型绑定行为,并允许从查询字符串绑定某些属性。在这种情况下,斯威格补充道 Latitude Longitude 因为查询参数和绑定工作正常。