c# - 返回 ASP.NET Core 2.2 中新创建资源的 URI
问题描述
我想返回 ASP.NET Core 2.2 中新创建资源的位置 URI。以下是为食品供应商获取食品的方法:
[HttpGet("{foodVendorId}/foodItems/{foodItemId}", Name = "GetFoodItem")]
public IActionResult GetFoodVendorFoodItem(int foodVendorId, int foodItemId)
{
if (!_foodDeliveryAPIRepository.FoodVendorExists(foodVendorId))
{
return NotFound();
}
var foodItem = _foodDeliveryAPIRepository.GetFoodItemForFoodVendor(foodVendorId, foodItemId);
if (foodItem == null)
{
return NotFound();
}
var foodItemResult = Mapper.Map<FoodItemDto>(foodItem);
return Ok(foodItemResult);
}
以下是为食品供应商添加或创建食品的方法:
[HttpPost("{foodVendorId}/foodItems")]
public IActionResult CreateFoodItem(int foodVendorId, [FromBody] FoodItemForCreationDto foodItem)
{
if (foodItem == null)
{
return BadRequest();
}
if (!_foodDeliveryAPIRepository.FoodVendorExists(foodVendorId))
{
return NotFound();
}
var finalFoodItem = Mapper.Map<Entities.FoodItem>(foodItem);
_foodDeliveryAPIRepository.AddFoodItemForFoodVendor(foodVendorId, finalFoodItem);
if (!_foodDeliveryAPIRepository.Save())
{
return StatusCode(500, "A problem happened while handling your request.");
}
var createdFoodItemToReturn = Mapper.Map<Models.FoodItemDto>(finalFoodItem);
return CreatedAtRoute("GetFoodItem", new
{ foodVendorId = foodVendorId, id = createdFoodItemToReturn.Id }, createdFoodItemToReturn);
}
创建 FoodItem 后,值会进入数据库,但在创建后会返回 500 服务器错误。调试后,我意识到错误在 CreatedAtRoute 的返回语句中 -
return CreatedAtRoute("GetFoodItem", new
{ foodVendorId = foodVendorId, id = createdFoodItemToReturn.Id }, createdFoodItemToReturn);
我做错了什么?-这并没有解决我的问题。
解决方案
我试图重现你的异常,我做到了。调试后,我注意到当您返回时,您将id作为foodItemIdCreatedAtRoute
的名称传递,这就是问题所在。
您的路由参数名称应该与您的 GET 操作输入名称完全相同。
所以这是我用来测试的简化代码:
[HttpGet("{foodVendorId}/foodItems/{foodItemId}", Name = "GetFoodItem")]
public IActionResult GetFoodVendorFoodItem(int foodVendorId, int foodItemId)
{
return Ok(";)");
}
[HttpPost("{foodVendorId}/foodItems")]
public IActionResult CreateFoodItem(int foodVendorId)
{
return CreatedAtRoute("GetFoodItem", new { foodVendorId, /* this was the problem => */ foodItemId = 5 }, new { result = "Done" });
}