api - 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:
基本上我试图继承生成文件的路由,但覆盖方法
解决方案
您需要将 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
根据需要调用 或其他方法。我希望这会有所帮助。
注意:这是我在我的一个项目中使用的经过测试的方法。我也测试了上面的代码,只是为了重新验证它是否有效。