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
我的 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