【发布时间】:2014-12-29 09:22:09
【问题描述】:
我有一个带有 PUT 方法的控制器,它通过 JSON 接受一组参数,然后更新数据库。但是,PUT 的默认行为似乎是,如果缺少参数,它将恢复为 null。
例如代码:
// PUT: api/Business/5
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> Putuser_business(int id, DTO_business_details dto_us_bus)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//new code
var dto_bus_details = await db.user_business.Select(us_bus =>
new DTO_business_details()
{
BusinessID = id,
BusinessName = us_bus.bus_name,
Address = us_bus.bus_address,
PhoneNumber = us_bus.bus_phone
}).SingleOrDefaultAsync(us_bus=> us_bus.BusinessID == id);
dto_us_bus.BusinessID = dto_bus_details.BusinessID;
if (dto_us_bus.BusinessName == null) { dto_us_bus.BusinessName = dto_bus_details.BusinessName ; }
if (dto_us_bus.Address== null) { dto_us_bus.Address= dto_bus_details.Address; }
if (dto_us_bus.PhoneNumber == null) { dto_us_bus.PhoneNumber = dto_bus_details.PhoneNumber; }
var user_business = new user_business()
{
bus_id = id,
bus_name = dto_us_bus.BusinessName,
bus_address = dto_us_bus.Address,
bus_phone = dto_us_bus.PhoneNumber,
};
db.Entry(user_business).State = EntityState.Modified;
try
{
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!user_businessExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
我发送的 JSON 可以正常工作,但是如果我发送 BusinessName 和 Address(即,如果我省略 PhoneNumber),它会将 PhoneNumber 更改为 null,而不是将 PhoneNumber 保留在数据库中。
我认为这是因为我将值设置为 DTO 值(因此,如果它们丢失,它将为空),但即使我不使用 DTO,行为也是一样的。我错过了什么还是这就是 PUT 的工作方式?
谢谢
编辑
我考虑过对 DB 进行 LINQ 选择,然后检查每个变量,如果它为空,则将其设置为从选择中获得的数据,但这不会像值实际通过一样工作作为用户的 null ,它将保留 DB 值。如果有一种方法可以确定 JSON 调用中是否缺少它而不是它是否为 null,这将起作用,但它似乎效率很低。
【问题讨论】:
标签: asp.net asp.net-web-api dto put