操纵WebAPi POST

时间:2016-02-21 10:49:41

标签: asp.net-web-api asp.net-web-api2

我有一个类似下面的WebAPI POST控制器:

    [ResponseType(typeof(Product))]
    public async Task<IHttpActionResult> PostProduct(Product product)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Products.Add(product);
        await db.SaveChangesAsync();

        return CreatedAtRoute("DefaultApi", new { id = product.Id }, product);
    }

为了有效,它需要几个值,比如Name,Price,URL,ManufactureID,StatusID。

但是,例如,POST并不总是包含StatusID的值,因此上述操作将失败,因为我不能为null。 但是当POST没有发送值时,我想“拦截”并在代码中设置值。我想对int 1。

我该怎么做?

我一直在使用DTO来以可靠的方式从API中提取数据。 DT也可以在POST中使用吗?如果是这样,怎么样?或者任何其他方法,如果设置数据,如果它没有在POST中激发?

2 个答案:

答案 0 :(得分:0)

我想创建您的产品请求模型,该模型将在您的WebAPI模型中定义,并且您可以将StatusID定义为可空。收到您的接收请求后,您可以将产品请求数据映射到ProductDto,如果需要,可以在该映射中设置默认值。

尽管你可以拦截客户端的请求并更新它,但我不确定是否适用于你。

答案 1 :(得分:0)

您应该创建一个与持久性无关的POST产品类。不要使用ORM生成的Product类。使用上面的示例,您应该拥有一个ProductModel类,该类仅包含API客户端可以更新的属性。然后将DTO映射到您的产品数据模型。

 public async Task<IHttpActionResult> PostProduct(ProductModel model)
{
   ...
   var product = db.Products.New();
   //mapping here
   product.Name = model.Name;
   product.Price = model.Price;
}