asp.net - 仅更新对象 .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 个字段或更多字段怎么样?我怎样才能做到这一点?
理想情况下,我需要找到一种方法来列出所有可以更新的字段,并让消费者选择他们想要放入请求正文的内容:) 如果他们尝试更新无法更新的字段,我会抛出错误
解决方案
推荐阅读
- docker - 使用 docker 在 windows 上安装 shopware 6
- vue.js - 如何最小化 vuejs 中的数据流量
- python - Tell the module requirements in a particular directory (package)
- firebase - Converting Firebase Token to String using Flutter
- c# - 将 JSON 反序列化为具有 ReactiveProperty 字段的嵌套类
- ruby-on-rails - 如何将我的复选框过滤器与我的搜索表单相关联?
- postgresql - 获取标识列的 nextval
- sql - 分组计数
- javascript - My state is not updating when typing on the input element
- wildfly - Is quorum needed in Keycloak Standalone Clustered Configuration?