我的 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);
}
“获取”路线如下所示:
[HttpGet("{id}", Name = "Get")]
public async Task<R> GetAsync(int id)
{
var model = await _service.GetItemAsync(id);
return model;
}
我有 2 个控制器类继承自这个基本控制器,当我尝试对这些控制器之一进行简单获取时,我收到以下错误消息:
错误 1:具有相同名称“Get”的属性路由必须具有相同的模板:Action: 'MyApi.WebApi.Controllers.FooController.GetAsync' - Template: 'api/foo/{id}' Action: 'MyApi.WebApi. Controllers.BarController.GetAsync' - 模板:'api/bar/{id}'
我收到此错误的原因非常明显,但我不知道如何在基本控制器中使用命名路由。
任何人都可以指出我正确的方向吗?
BaseController
使用路由名称参数化逻辑。从父级中删除任何路由逻辑。使用 aconst 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();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句