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();
有一个控制器有 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();