子控制器中有没有办法隐藏基本通用控制器的动作?

问题描述

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

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

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

然而,只有当孩子和父母有相同的路线时才有效。如果他们有不同的路由,但您出于某种原因需要隐藏在 7 个父控制器操作的子控制器 1 中,您该怎么做?

解决方法

您可以尝试使用中间件来检查路由是否允许。这里是一个演示:

//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.
            });

结果: enter image description here

,

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

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

您可能希望将 BaseController 分成两层。

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

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

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

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

,

NonAction 属性,您可以像这样将其放入重写的方法中:

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