在我的ASP.Net核心Web项目中有一个通用的抽象控制器,带有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;
}
我有两个Controller类,它们继承于这个Base,当我试图对其中一个控制器进行简单的获取时,会得到以下错误消息:
错误1:具有相同名称“Get”的属性路由必须具有相同的模板: Action:'MyApi.WebApi.Controllers.FooController.GetAsync‘- template:'api/foo/{id}’'MyApi.WebApi.Controllers.BarController.GetAsync‘-’MyApi.WebApi.Controllers.BarController.GetAsync‘:'api/bar/{id}’
这是非常明显的原因,我得到这个错误,但我不知道如何使用一个命名的路线,在一个基础控制器。
谁能给我指明正确的方向?
发布于 2017-05-08 15:58:12
使用路由名称参数化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();
}
}
发布于 2018-02-21 14:12:11
使用CreatedAtAction
而不是CreateAtRoute
,后者仍将返回状态201,您不需要担心路由名称。多亏了@CodeFuller,我才解决了同样的问题。
return CreatedAtAction(nameof(GetAsync), new { id = 123 }, createObjectDto);
请参阅以下链接Route Name for HttpGet attribute Name for base generic controller class in asp.net core
https://stackoverflow.com/questions/43851562
复制相似问题