gpt4 book ai didi

c# - ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute

转载 作者:行者123 更新时间:2023-11-30 21:41:04 28 4
gpt4 key购买 nike

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

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

“获取”路线如下所示:

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

return model;
}

我有 2 个继承自该基本 Controller 的 Controller 类,当我尝试对其中一个 Controller 进行简单访问时,我收到以下错误消息:

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}'

我收到此错误的原因很明显,但我不知道如何在基本 Controller 中使用命名路由。

谁能指出我正确的方向?

最佳答案

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

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();
}
}

关于c# - ASP.Net Web Api Core - 无法在抽象基类中使用 CreatedAtRoute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43851562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com