Есть ли способ в дочернем контроллере скрыть действия от базового универсального контроллера?

Существует контроллер с 7 действиями, которые повторно используются всеми другими дочерними контроллерами. При необходимости можно скрыть конечные точки, используя в атрибуте «порядок пути». Следующий код скрывает родительское действие:

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

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

Однако это работает только в том случае, если у ребенка и родителя один и тот же маршрут. Если у них другой маршрут, но вам по какой-то причине нужно скрыть в дочернем контроллере 1 из 7 действий родительского контроллера, как вы это сделаете?

public override IActionResult SomeAction() => NotFound(); ?
vasily.sib 24.12.2020 04:23

@vasily.sib не работает

Emily 24.12.2020 14:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
588
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете попробовать использовать промежуточное программное обеспечение, чтобы проверить, разрешен ли маршрут. Вот демонстрация:

//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();

Другие вопросы по теме