允许 class 属性在 WebAPI 2 post 方法中为空
Allow class properties to be null in WebAPI 2 post methods
我正在使用两个 POCO 类:
public class GearModel
{
public long Id { get; set; }
public Int16 LocationNumber { get; set; }
public string HooksPerRod { get; set; }
public string TerminalWeightBait { get; set; }
public string TerminalWeight { get; set; }
public FlyModel Shrimps { get; set; }
public FlyModel Worms { get; set; }
public FlyModel Cocahoes { get; set; }
public FlyModel Scampi { get; set; }
}
public class FlyModel
{
public double? Number { get; set; }
public string Color { get; set; }
}
当我尝试 post 到我的 API 控制器(定义如下)时,它抱怨 Null value for non-nullable member. Member: 'Worms'.
,当使用此 cURL 命令向它 post 时(我知道 none 的 cURL 参数是问题所在,如果我包含它工作的所有 FlyModel
属性。
不工作
curl -X POST -v -H "Content-Type: application/json" --data-ascii "{Assn:102,LocationNumber:1,HooksPerRod:3,TerminalWeightBait:'None',TerminalWeight:'18oz',Shrimps:{Number:0.0,Color:'Pink'}}" <Url Here>
工作
curl -X POST -v -H "Content-Type: application/json" --data-ascii "{Assn:102,LocationNumber:1,HooksPerRod:3,TerminalWeightBait:'None',TerminalWeight:'18oz',Shrimps:{Number:0.0,Color:'Pink'},Worms:{},Cocahoes:{},Scampi:{}}" <Url Here>
所以我的问题是,如何允许 FlyModel 属性(虾、蠕虫等)完全排除在 JSON 之外,就像在不工作的 cURL 命令中一样?
齿轮控制器
public class GearController : ApiController
{
// POST: api/Gear
[ResponseType(typeof(GearModel))]
public async Task<IHttpActionResult> PostGearModel(GearModel gearModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Gear.Add(gearModel);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = gearModel.Assn }, gearModel);
}
}
我假设您指的是 db.SaveChangesAsync();
之后的错误,这是由 Entity Framework
引起的,Web Api
在这里没有任何改变。发生该错误是因为 EF
不允许复杂类型可空性,这意味着 您需要在保存 之前实例化每个复杂类型 Shrimps, Worms...
。
您可以在以下位置阅读有关该公约的更多信息:Complex Types of Nullable Values
或 Complex Types Nullability Convention
我正在使用两个 POCO 类:
public class GearModel
{
public long Id { get; set; }
public Int16 LocationNumber { get; set; }
public string HooksPerRod { get; set; }
public string TerminalWeightBait { get; set; }
public string TerminalWeight { get; set; }
public FlyModel Shrimps { get; set; }
public FlyModel Worms { get; set; }
public FlyModel Cocahoes { get; set; }
public FlyModel Scampi { get; set; }
}
public class FlyModel
{
public double? Number { get; set; }
public string Color { get; set; }
}
当我尝试 post 到我的 API 控制器(定义如下)时,它抱怨 Null value for non-nullable member. Member: 'Worms'.
,当使用此 cURL 命令向它 post 时(我知道 none 的 cURL 参数是问题所在,如果我包含它工作的所有 FlyModel
属性。
不工作
curl -X POST -v -H "Content-Type: application/json" --data-ascii "{Assn:102,LocationNumber:1,HooksPerRod:3,TerminalWeightBait:'None',TerminalWeight:'18oz',Shrimps:{Number:0.0,Color:'Pink'}}" <Url Here>
工作
curl -X POST -v -H "Content-Type: application/json" --data-ascii "{Assn:102,LocationNumber:1,HooksPerRod:3,TerminalWeightBait:'None',TerminalWeight:'18oz',Shrimps:{Number:0.0,Color:'Pink'},Worms:{},Cocahoes:{},Scampi:{}}" <Url Here>
所以我的问题是,如何允许 FlyModel 属性(虾、蠕虫等)完全排除在 JSON 之外,就像在不工作的 cURL 命令中一样?
齿轮控制器
public class GearController : ApiController
{
// POST: api/Gear
[ResponseType(typeof(GearModel))]
public async Task<IHttpActionResult> PostGearModel(GearModel gearModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Gear.Add(gearModel);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = gearModel.Assn }, gearModel);
}
}
我假设您指的是 db.SaveChangesAsync();
之后的错误,这是由 Entity Framework
引起的,Web Api
在这里没有任何改变。发生该错误是因为 EF
不允许复杂类型可空性,这意味着 您需要在保存 之前实例化每个复杂类型 Shrimps, Worms...
。
您可以在以下位置阅读有关该公约的更多信息:Complex Types of Nullable Values 或 Complex Types Nullability Convention