我有一个类似下面的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中激发?
答案 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;
}