【问题标题】:Is there a way in a child controller to hide actions from a base generic controller?子控制器中是否有办法隐藏基本通用控制器的操作?
【发布时间】:2020-12-24 02:31:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • public override IActionResult SomeAction() => NotFound(); ?
  • @vasily.sib 不工作

标签: c# asp.net asp.net-core asp.net-web-api asp.net-apicontroller


【解决方案1】:

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

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

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

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

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

如果您在整个地方都隐藏了路线,并且许多路线隐藏在某些控制器中,而不是隐藏在其他控制器中,这表明您根本不需要 BaseController,并且应该修剪直到您从未发现需要隐藏的端点。

总结:如果您发现自己不得不隐藏通过继承暴露的端点,这是一种代码异味,您可以通过修剪父类或重构上面构建层的方式来做到这一点。

【讨论】:

    【解决方案2】:

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

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

    结果:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多