child 控制器中是否有一种方法可以隐藏基本通用控制器的操作?

Is there a way in a child controller to hide actions from a base generic controller?

有一个控制器有 7 个动作,这些动作 被所有其他 child 控制器重用。如果有必要,可以使用属性中的“路径顺序”隐藏端点。以下代码隐藏了 parent 操作:

[Post("{id}, Order = 1")]//In the parent

[Post("{id}")]//In the child.

但是,这仅在 child 和 parent 具有相同路线时有效。如果他们有不同的路线,但您出于任何原因需要隐藏在 7 parent 控制器操作中的 child 控制器 1 中,您会怎么做?

你可以尝试使用中间件来检查路由是否是allowed.Here是一个demo:

//add the urls which you want to hidden to string[] urls
string[] urls = { "Child1/Action1", "Child2/Action2" };
            app.Use(async (context, next) =>
            {
                var s = context.Request.Path.ToString();
                if (urls.Any(s.Contains)) {
                    //if path contains any one in urls,return 404 not found
                    context.Response.StatusCode = 404;
                    return;
                }
                // Do work that doesn't write to the Response.
                await next.Invoke();
                // Do logging or other work that doesn't write to the Response.
            });

结果:

如果您发现自己不得不在子控制器中“隐藏”路由,我建议您花点时间重新评估您组织父对象的方式。

假设您的七条路线 A、B、C...G,您有三个控制器都需要“隐藏”G 路线。

您可能想将 BaseController 分成两层。

BaseController 具有路由 A 到 F,然后是 SecondaryBaseController 继承自 BaseController 并实现路由 G,除了这三个控制器外,其他所有控制器都继承自该路由。剩下的三个只是继承自BaseController

那么这三个控制器根本就没有 G 需要隐藏的路由。

如果你到处隐藏路由,并且许多路由隐藏在某些控制器中,而不是隐藏在其他控制器中,这表明你根本不需要 BaseController,并且应该精简到您从未发现需要隐藏的端点。

总结:如果您发现自己不得不隐藏通过继承公开的端点,那么您可以通过修剪父级 class 或重构上面的层的构建方式来解决代码问题。

NonAction 属性,你可以像这样把它放在覆盖的方法中:

    [NonAction]
    public override Task<IActionResult> GetAll() => base.GetAll();