首页 > 解决方案 > Asp.Net Core - 继承控制器及其路由,但覆盖方法

问题描述

我有一个使用 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:

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

标签: apiasp.net-corecontrollerroutesoverriding

解决方案


您需要将 your 定义TeamApiController为一个abstract类,以便它不会被识别为 aController本身。这样,您需要将所有属性移动到派生类。所以,你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根据需要调用 或其他方法。我希望这会有所帮助。

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


推荐阅读