C# ASP.Net Web Api核心-无法在抽象基类中使用CreatedAtRoute
我的ASP.Net核心Web Api项目中有一个通用抽象控制器,具有后期处理功能:C# ASP.Net Web Api核心-无法在抽象基类中使用CreatedAtRoute,c#,asp.net,asp.net-web-api,.net-core,asp.net-core-webapi,C#,Asp.net,Asp.net Web Api,.net Core,Asp.net Core Webapi,我的ASP.Net核心Web Api项目中有一个通用抽象控制器,具有后期处理功能: [HttpPost] public async Task<IActionResult> Create([FromBody]R itemDto) { var ret = await _service.CreateNewItemAsync(itemDto); return CreatedAtRoute("Get", new { id = ret.Id }, ret); } [
[HttpPost]
public async Task<IActionResult> Create([FromBody]R itemDto)
{
var ret = await _service.CreateNewItemAsync(itemDto);
return CreatedAtRoute("Get", new { id = ret.Id }, ret);
}
[HttpPost]
公共异步任务创建([FromBody]R itemDto)
{
var ret=wait_service.CreateNewItemAsync(itemDto);
返回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;
}
[HttpGet(“{id}”,Name=“Get”)]
公共异步任务GetAsync(int id)
{
var model=await\u service.GetItemAsync(id);
收益模型;
}
我有两个控制器类,它们继承自此基本控制器,当我尝试对其中一个控制器进行简单的get时,会收到以下错误消息:
错误1:
具有相同名称“Get”的属性路由必须具有相同的模板:
操作:“MyApi.WebApi.Controllers.FooController.GetAsync”-模板:“api/foo/{id}”
操作:“MyApi.WebApi.Controllers.BarController.GetAsync”-模板:“api/bar/{id}”
很明显,为什么会出现这个错误,但我不知道如何在基本控制器中使用命名路由
有人能给我指出正确的方向吗?用路由名称参数化
BaseController
逻辑。从父级中删除任何路由逻辑。使用常量字符串
参数化子控制器中的属性。然后将此字符串传递给父级:
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();
}
}
公共类BaseController:控制器
{
//没有路由属性
公共IActionResult CreateImpl(字符串routeName)
{
//把逻辑放在这里
返回CreatedAtRoute(routeName,new object());
}
}
[路由(“api/[控制器]”)]
公共类FooController:BaseController
{
私有常量字符串_getRouteName=“Get_”+nameof(FooController);
[HttpPost]
公共异步任务创建()
{
返回CreateImpl(_getRouteName);
}
[HttpGet(名称=_getRouteName)]
公共重写字符串Get()
{
返回base.Get();
}
}
使用createDataAction
而不是CreateAtRoute
,后者仍将返回状态201,您无需担心路由名称。多亏了@CodeFuller,我才解决了同样的问题
return CreatedAtAction(nameof(GetAsync), new { id = 123 }, createObjectDto);
请参考以下链接谢谢您的回答。在代码中,您将Get和Post放在派生类中。我的代码拥有BaseController中的所有逻辑,因为这样可以避免代码重复。有没有可能避免在每个派生控制器中使用相同的代码?好的,我读代码太快了。就我对asp.net内核中路由的理解而言,我没有其他机会以这种方式进行路由。@ThomasGeulen,没错,Get和Post不包含任何业务逻辑。子控制器仅管理路由。因为我们不能用相同的名称声明多个路由,所以子控制器应该声明自己的路由。我有类似的问题(),如果您的问题已经解决,请告诉我。