Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net Web Api核心-无法在抽象基类中使用CreatedAtRoute_C#_Asp.net_Asp.net Web Api_.net Core_Asp.net Core Webapi - Fatal编程技术网

C# ASP.Net Web Api核心-无法在抽象基类中使用CreatedAtRoute

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

我的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]
公共异步任务创建([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不包含任何业务逻辑。子控制器仅管理路由。因为我们不能用相同的名称声明多个路由,所以子控制器应该声明自己的路由。我有类似的问题(),如果您的问题已经解决,请告诉我。