我想用GET方法绑定不变的模型。它的帖子很好。为什么?
[HttpGet]
public string Get([FromQuery]Something something)
{
return "value";
}
[HttpPost]
public void Post([FromBody]Something something)
{
}
public class Something
{
public string Prop1 { get; }
public int Prop2 { get; }
public Something(string prop1, int prop2)
{
Prop1 = prop1;
Prop2 = prop2;
}
}
使用Get方法,我得到了例外:
invalidoperationException:无法创建类型的实例 webapplication2.something;。模型绑定的复杂类型不得是 抽象或价值类型,必须具有无参数构造函数。
它与[FromQuery]
和[FromBody]
属性有关?
[FromBody]
将标志属于MVC管道,以使用配置的格式器来绑定请求主体的数据。基于请求的内容类型选择了格式器。
JsonInputFormatter
是基于json.net的默认格式,它只是进行JSON String Body pelelialization(代码(:
model = jsonSerializer.Deserialize(jsonReader, type);
原因在避难所中未调用对象的构造函数,您没有任何错误,例如" 必须具有无参数构造函数"。
。相反,对于[FromQuery]Something
,使用了复杂Typemodelbinder,它首先通过调用默认构造函数来创建Something
类的实例,然后将相应的值分配给公共属性。检查BindModeLcoreasync方法以获取实现详细信息。
[HttpGet]
public string Get([FromQuery]Something something)
{
return "value";
}
[FromQuery]Something something
参数期望您发送该类型的对象。您不能在Querystring中执行此操作,因为它只能采用"简单类型",例如int
和string