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