在WebAPI 2 post方法中允许类属性为null

时间:2015-05-21 18:58:05

标签: c# json asp.net-web-api2

我正在使用两个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; }
}

当我尝试发布到我的API控制器(定义如下)时,它会使用此cURL命令发布给它{抱怨Null value for non-nullable member. Member: 'Worms'.(我知道没有任何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属性(Shrimps,Worms等)完全排除在JSON之外,就像在无效的cURL命令中一样?

GearController

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);
    }
}

1 个答案:

答案 0 :(得分:1)

我假设您指的是db.SaveChangesAsync();之后的错误Entity FrameworkWeb Api此处不会更改任何内容。发生错误是因为EF不允许复杂类型为空,这意味着您需要在保存之前实例化每个复杂类型Shrimps, Worms...

您可以在Complex Types of Nullable Values了解有关此约定的更多信息 或Complex Types Nullability Convention