【问题标题】:Asp.Net Core - inherit controller and its routes, but override the methodsAsp.Net Core - 继承控制器及其路由,但覆盖方法
【发布时间】:2019-05-13 22:26:07
【问题描述】:

我有一个使用 mvn 生成的控制器,看起来像这样......

    public class TeamApiController : ControllerBase
    { 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="teamID"></param>
        /// <response code="200">Success</response>
        [HttpGet]
        [Route("/api/Team/{teamID}/members")]
        [ValidateModelState]
        [SwaggerOperation("GetStaffMembersByTeamID")]
        [SwaggerResponse(statusCode: 200, type: typeof(TeamDetails), description: "Success")]
        public virtual IActionResult GetStaffMembersByTeamID([FromRoute][Required]int? teamID)
        { 
             // return null;
        }
    }

我想继承这个控制器并实现我自己的方法

 public class TeamImpController : TeamApiController
    {
        private readonly IStaffService staffService;
        public TeamImpController(IStaffService staffService)
        {
            this.staffService = staffService;
        }

        public override IActionResult GetStaffMembersByTeamID([FromRoute][Required]int? teamID)
        {
            // write my override method
        }
    }

一切都编译了,但是当我运行它时得到

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

基本上我试图继承生成文件的路由,但覆盖方法

【问题讨论】:

    标签: api asp.net-core controller routes overriding


    【解决方案1】:

    正如我在这里看到的,没有必要从 TeamApiController 继承,因为这两种方法必须具有相同参数的不同实现,您也可以将实现分离到服务或域方法,只需从控制器调用实现

    【讨论】:

      【解决方案2】:

      您需要将您的TeamApiController 定义为abstract 类,这样它本身就不会被识别为Controller。这样,您需要将所有属性移动到派生类。所以,你的TeamApiController 会变成

      public abstract class TeamApiController : ControllerBase
      { 
          /// <summary>
          /// 
          /// </summary>
          /// <param name="teamID"></param>
          /// <response code="200">Success</response>
          public virtual IActionResult GetStaffMembersByTeamID(int? teamID)
          { 
               // return null;
          }
      }
      

      你的TeamTmpController会变成

      public class TeamTmpController : TeamApiController
      {
          private readonly IStaffService staffService;
          public TeamImpController(IStaffService staffService)
          {
              this.staffService = staffService;
          }
      
          [HttpGet]
          [Route("/api/Team/{teamID}/members")]
          [ValidateModelState]
          [SwaggerOperation("GetStaffMembersByTeamID")]
          [SwaggerResponse(statusCode: 200, type: typeof(TeamDetails), description: "Success")]
          public override IActionResult GetStaffMembersByTeamID([FromRoute][Required]int? teamID)
          {
              // write my override method
          }
      }
      

      如果您有另一个从 TeamApiController 继承的控制器,并且您需要基本功能。只需根据需要调用return base.GetStaffMembersByTeamID 或其他方法。我希望这会有所帮助。

      注意:这是我在我的一个项目中使用的经过测试的方法。我也测试了上面的代码,只是为了重新验证它是否有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 2016-07-12
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多