我正在使用 .NET Core 开发Web API,当我向Web API发送帖子或更新时,我正在返回资源。为此,在每种方法的最后,我使用的是CreatedAtAction
方法,其中第一个参数是动作名称。
例如,当我使用硬编码的动作名称CreatedAtAction("GetBook", [...]
时,它可以工作。但是,当我使用CreatedAtRoute(nameof(GetBook), [...]
时,出现一条错误消息,指出没有路由匹配。有什么特别的原因吗?
答案 0 :(得分:1)
好像您混合使用了CreatedAt*Action*
和CreatedAt*Route*
方法。 nameof(GetBook)
肯定会返回"GetBook"
。
答案 1 :(得分:0)
请参考以下链接:https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-2.2 它显示 CreatedAtAction ((nameof(GetBook),[...]))应该起作用。
答案 2 :(得分:0)
CreateAtRoute
是一个帮助方法,继承自ControllerBase 。 CreateAtRoute()
的作用是简单地返回一个新的CreatedAtRouteResult(routeName,routeValues,值)。根本没有黑魔法:
/// <summary>
/// Creates a <see cref="CreatedAtRouteResult"/> object that produces a <see cref="StatusCodes.Status201Created"/> response.
/// </summary>
/// <param name="routeName">The name of the route to use for generating the URL.</param>
/// <param name="routeValues">The route data to use for generating the URL.</param>
/// <param name="value">The content value to format in the entity body.</param>
/// <returns>The created <see cref="CreatedAtRouteResult"/> for the response.</returns>
[NonAction]
public virtual CreatedAtRouteResult CreatedAtRoute(string routeName, object routeValues, object value)
=> new CreatedAtRouteResult(routeName, routeValues, value);
CreateAtRoute
方法通常在ApiController中使用,第三个参数将用作response的内容。假设一个动作方法:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet("{id}", Name = "HelloDetails")]
public IActionResult GetDetail(int id)
{
var result = new MyItem() {
Id=id,
ItemName="sherry"
};
return new JsonResult(result);
}
[HttpPost]
public async Task<IActionResult> Create([FromBody] MyItem item)
{
if (item == null)
{
return BadRequest();
}
return CreatedAtRoute("HelloDetails", new { id = item.Id }, item);
}
使用Postman进行测试,结果为201。响应的正文包含我们创建的实体的详细信息,响应的Location标头包含指向该实体的URI。
您也可以看看此link