首页 > 解决方案 > 仅更新对象 .NET API 中的一个字段

问题描述

我尝试编写一个处理 PUT 请求的路由。这只是我在网上找到的一个例子。

控制器

[HttpPut]
    [Route("{id:int}", Name = nameof(UpdateFood))]
    public ActionResult<FoodDto> UpdateFood(int id, [FromBody] FoodUpdateDto foodUpdateDto)
    {
        if (foodUpdateDto == null)
        {
            return BadRequest();
        }

        var existingFoodItem = _foodRepository.GetSingle(id);

        if (existingFoodItem == null)
        {
            return NotFound();
        }

        _mapper.Map(foodUpdateDto, existingFoodItem);

        _foodRepository.Update(id, existingFoodItem);

        if (!_foodRepository.Save())
        {
            throw new Exception("Updating a fooditem failed on save.");
        }

        return Ok(_mapper.Map<FoodDto>(existingFoodItem));
    }

FoodUpdateDto

namespace SampleWebApiAspNetCore.Dtos
{
    public class FoodUpdateDto
    {
        public string Name { get; set; }
        public int Calories { get; set; }
        public string Type { get; set; }
        public DateTime Created { get; set; }
    }
}

看看这个例子。要更新食物模型,我需要用 body 发送一个 PUT 请求

{
 "name": "Updated name",
 "calories": 200,
 "type": "Vegan",
 "dateTime": "20-09-1998"
} 

这很好用,但有一种情况是我只需要更新名称(或类型或卡路里)字段。我只想将需要更新的字段发送到 API(而不是整个对象字段)。在某些情况下,我只知道要更新的字段的 id 和值

// 只想更新名称 => 请求正文

{"name": "Updated name"}

// 只想更新卡路里 => 请求正文

{"calories": 200}

// 只想命名卡路里 => 请求正文

{"name": "Updated name", "calories": 200}

你明白了我的想法。更新的主体将是动态的,它取决于 API 使用者。你会说,只是创建一个只包含名称字段的新 DTO?食物对象很简单。我的模型中有多达 30 个字段或更多字段怎么样?我怎样才能做到这一点?

理想情况下,我需要找到一种方法来列出所有可以更新的字段,并让消费者选择他们想要放入请求正文的内容:) 如果他们尝试更新无法更新的字段,我会抛出错误

标签: asp.net.net-core

解决方案


推荐阅读