为什么需要 [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 个值(好吧,那里还有 action
和 controller
值,但现在没关系)所以可以只绑定 Name
属性 of GetStuffModel
(如果您将 string Action
属性 添加到模型中,您会看到它也会被绑定)。当您将 [FromQuery]
属性添加到模型属性时,它会覆盖模型绑定行为并允许从查询字符串绑定某些属性。在这种情况下,swagger 添加 Latitude
和 Longitude
作为查询参数并且绑定工作正常。
我使用以下操作创建了一个 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 个值(好吧,那里还有 action
和 controller
值,但现在没关系)所以可以只绑定 Name
属性 of GetStuffModel
(如果您将 string Action
属性 添加到模型中,您会看到它也会被绑定)。当您将 [FromQuery]
属性添加到模型属性时,它会覆盖模型绑定行为并允许从查询字符串绑定某些属性。在这种情况下,swagger 添加 Latitude
和 Longitude
作为查询参数并且绑定工作正常。