我想用GET方法绑定Immutable模型。它适用于POST。为什么?
[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]
属性有关?
答案 0 :(得分:2)
[FromBody]
属性标记到MVC管道,以使用配置的格式化程序绑定来自请求主体的数据。根据请求的内容类型选择格式化程序。
JsonInputFormatter
是默认格式化程序,基于Json.NET,它只是执行JSON字符串体反序列化(code):
model = jsonSerializer.Deserialize(jsonReader, type);
在反序列化过程中导致对象的构造函数没有被调用,你不会有任何错误,例如" 必须有一个无参数构造函数"。
相反,对于[FromQuery]Something
,使用ComplexTypeModelBinder,它首先通过调用默认构造函数创建Something
类的实例,然后将相应的值分配给公共属性。检查BindModelCoreAsync method for implementation details。
答案 1 :(得分:1)
[HttpGet]
public string Get([FromQuery]Something something)
{
return "value";
}
[FromQuery]Something something
参数要求您发送该类型的对象。你不能在查询字符串中这样做,因为它只能接受"简单类型"例如int
和string