【问题标题】:Manipulate WebAPi POST操作 WebAPI POST
【发布时间】:2016-02-21 10:49:40
【问题描述】:

我有一个如下所示的 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);
    }

为了有效,它需要几个值,比如名称、价格、URL、ManufactureID、StatusID。

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

我该怎么办?

我一直在使用 DTO 从 API 中提取数据,以一种很好且可查看的方式。 DToes 也可以在 POST 中使用吗?如果是这样,怎么做?或者任何其他方法来设置数据,如果它不存在于 POST 中?

【问题讨论】:

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


    【解决方案1】:

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

    尽管您可以在客户端拦截请求并对其进行更新,但我不确定这是否适合您。

    【讨论】:

      【解决方案2】:

      您应该创建一个与持久性无关的 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        相关资源
        最近更新 更多