Можно ли привязать значение маршрута к свойству пользовательского атрибута в ASP.NET Core Web API? - PullRequest
1 голос
/ 21 апреля 2019

У меня есть пользовательский атрибут, который я использую для авторизации запроса до того, как он выполнит действие контроллера, в ASP.NET Core Web API. На изображении ниже " SecureMethod " является пользовательским атрибутом.

enter image description here

Я хочу добавить свойство в пользовательский атрибут, которое я хочу привязать к одному из значений маршрута, см. Изображение ниже: enter image description here

Я хочу привязать значение маршрута "userIDs" к одному из свойств пользовательского атрибута ("UserIDs", это пример атрибута ).

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

ТИА

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Один из способов сделать это - передать имя параметра маршрута в атрибут и изучить данные маршрута в самом атрибуте.Например:

[SecureMethod(PermissionRequired = AccessPermissionEnum.DeleteUsers, UserIdsKey = "userIds")]

Тогда что-то вроде:

public AccessPermissionEnum PermissionRequired { get; set; }
public string UserIdsKey { get; set; }

public override void OnActionExecuting(ActionExecutingContext context)
{
    // Depending on how you pass your userIds to the action, you
    // may need to use something else from context to get the data,
    // but it's all available in there.
    var userIds = context.ActionArguments[UserIdsKey];

    // Do something with the ids.

    base.OnActionExecuting(context);
}

Хотя это работает и в некоторых местах работает очень хорошо, вы должны знать, что фильтр теперь обладает глубокими знаниями опередаваемый параметр. По большей части, это обычно не имеет большого значения, но этот подход не следует использовать повсеместно, поскольку в конечном итоге он будет добавлять много связей, если не будет использоваться должным образом.Это полезный инструмент для использования время от времени.

1 голос
/ 21 апреля 2019

Нет, это невозможно.

Параметры атрибутов ограничены постоянными значениями следующих типов:

  • Простые типы (bool, byte, char, short, int, long, float и double)

  • string

  • System.Type

  • enums

  • объект (Аргумент к параметру атрибута типа объект должен быть постоянным значением одного из указанных выше типов.)

  • Одномерные массивы любого из указанных выше типов

Вы не можете вкладывать атрибуты и не можете передавать непостоянные значения в параметр атрибута.Даже если вы можете объявить параметр атрибута как объект типа, фактический аргумент, который вы передаете, должен быть константной строкой, bool и т. Д. (Объявление его как объекта просто означает, что вы можете использовать любой из этих типов каждый раз, когда объявляете атрибут).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...