ASP.Net Web Api Core - 无法在抽象基础中使用 CreatedAtRoute class

ASP.Net Web Api Core - Unable to use CreatedAtRoute in abstract base class

我的 ASP.Net 核心 Web Api 项目中有一个通用抽象控制器 POST 处理:

 [HttpPost]
 public async Task<IActionResult> Create([FromBody]R itemDto)
 {
     var ret = await _service.CreateNewItemAsync(itemDto);
     return CreatedAtRoute("Get", new { id = ret.Id }, ret);
 }

'Get' 路线如下所示:

 [HttpGet("{id}", Name = "Get")]
 public async Task<R> GetAsync(int id)
 {
     var model = await _service.GetItemAsync(id);

     return model;
 }

我有 2 个控制器 类 继承自这个基本控制器,当我尝试简单地访问这些控制器之一时,我收到以下错误消息:

Error 1: Attribute routes with the same name 'Get' must have the same template: Action: 'MyApi.WebApi.Controllers.FooController.GetAsync' - Template: 'api/foo/{id}' Action: 'MyApi.WebApi.Controllers.BarController.GetAsync' - Template: 'api/bar/{id}'

很明显为什么会出现此错误,但我不知道如何在基本控制器中使用命名路由。

谁能指出我正确的方向?

使用路由名称参数化 BaseController 逻辑。从父级中删除任何路由逻辑。使用 const string 参数化子控制器中的属性。然后将此字符串传递给父级:

public class BaseController : Controller
{
    //no routing attributes
    public IActionResult CreateImpl(string routeName)
    {
        //place any logic here
        return CreatedAtRoute(routeName, new object());
    }
}

[Route("api/[controller]")]
public class FooController : BaseController
{
    private const string _getRouteName = "Get_" + nameof(FooController);

    [HttpPost]
    public async Task<IActionResult> Create()
    {
        return CreateImpl(_getRouteName);
    }

    [HttpGet(Name = _getRouteName)]
    public override string Get()
    {
        return base.Get();
    }
}

使用CreatedAtAction而不是CreateAtRoute,这仍然是return Status 201,您无需担心路由名称。感谢@CodeFuller 这就是我解决同样问题的方法。

 return CreatedAtAction(nameof(GetAsync), new { id = 123 }, createObjectDto);

请参考以下link