【问题标题】:Update/Put method based on custom id?基于自定义 id 的更新/放置方法?
【发布时间】:2016-03-02 13:56:44
【问题描述】:

以下是使用实体框架的 Web Api 2 项目中 PUT 方法的标准支架代码。

当您拥有产品的 id 时,这很有效。

但是,我有一种情况,我想更新/放置一个产品不是基于表中的唯一 ID,而是一个不同的字段“internalRef”(字符串)与制造商 ID 相结合。 所以,我首先想检查是否有 internalRef='123' 和manufacturerId=1 的产品。如果没有返回 NotFound()。如果有,则使用发布的数据更新该产品。

关于如何做到这一点的任何建议?

[Route("product/update")]
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutProduct(int id, Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (id != product.Id)
    {
        return BadRequest();
    }

    db.Entry(product).State = EntityState.Modified;

    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return StatusCode(HttpStatusCode.NoContent);
}

【问题讨论】:

  • 我不太明白你的问题,你能不能不改变Put方法签名?!
  • 我怀疑我确实可以。但是怎么做?我觉得我一直盯着自己看,看不到明显的东西
  • 类似这样的东西:public async Task PutProduct(string id, Product product) no?

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


【解决方案1】:

Put 示例只是一个模板,您必须根据自己的要求进行修改。在您的情况下,使您的实体独一无二的不是 Id,而是 internalRef 和制造商。因此,您只需替换/调整您的代码即可使用 internalRef+manufacturer 的复合唯一 ID。

[Route("product/update")]
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutProduct(string internalRef, int manufacturer, Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (internalRef != product.InternalRef && manufacturer != product.Manufacturer)
    {
        return BadRequest();
    }

    db.Entry(product).State = EntityState.Modified;

    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(internalRef, manufacturer))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return StatusCode(HttpStatusCode.NoContent);
}

记得把方法ProductExists(int id)改成自己的ProductExists(string internalRef, int manufacturer)才能正常工作。

【讨论】:

  • 啊,看起来我可以使用的东西。但我不确定这是做什么的; internalRef != product.InterRef。它在检查什么?而ModelStat.IsValid,不会是假的,当tehre没有int id的时候,提交了吗?
  • 'internalRef != product.InternalRef && manufacturer != product.Manufacturer' 检查 internalRef 和制造商是否来自您要更改的产品。如果没有,您将更改不正确的产品。相同的逻辑适用于“代码中的 id != product.Id”。另一方面,ModelState.IsValid 将验证由参数发送的 Product 实例,而不是 id。检查下一个链接以更好地理解它:exceptionnotfound.net/asp-net-mvc-demystified-modelstate.
  • 我现在尝试了您的建议,但我收到错误消息“存储更新、插入或删除语句影响了意外的行数 (0)”。然后我发现当我在 PUT 中包含唯一的“id”属性时它可以工作。但这正是我想避免的,因为更新记录的人不知道 ID,而只知道 internalRef 和manufacturerId?我错过了什么吗? :)
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2016-10-13
  • 2017-08-12
相关资源
最近更新 更多