Существует контроллер с 7 действиями, которые повторно используются всеми другими дочерними контроллерами. При необходимости можно скрыть конечные точки, используя в атрибуте «порядок пути». Следующий код скрывает родительское действие:
[Post("{id}, Order = 1")]//In the parent
[Post("{id}")]//In the child.
Однако это работает только в том случае, если у ребенка и родителя один и тот же маршрут. Если у них другой маршрут, но вам по какой-то причине нужно скрыть в дочернем контроллере 1 из 7 действий родительского контроллера, как вы это сделаете?
@vasily.sib не работает
Вы можете попробовать использовать промежуточное программное обеспечение, чтобы проверить, разрешен ли маршрут. Вот демонстрация:
//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
, и вы должны обрезать только конечные точки. которые вы никогда не найдете, требуют скрытия.
Подводя итог: если вам приходится скрывать конечные точки, которые вы открыли через наследование, это запах кода, который вы могли бы сделать, обрезав родительский класс или рефакторинг того, как вы построили слои выше.
Существует атрибут NonAction
, который вы можете поместить в переопределенный метод следующим образом:
[NonAction]
public override Task<IActionResult> GetAll() => base.GetAll();
public override IActionResult SomeAction() => NotFound();
?