2015-08-07 12 views
34

Na podstawie this article próbuję utworzyć implementację IActionFilter dla Core ASP.NET, która może przetwarzać atrybuty zaznaczone na kontrolerze i akcji kontrolera. Chociaż odczyt atrybutów kontrolera jest łatwy, nie mogę znaleźć sposobu na odczytanie atrybutów zdefiniowanych w metodzie akcji.Jak odczytać atrybuty metody działania w ASP.NET Core MVC?

Oto kod mam teraz:

public sealed class ActionFilterDispatcher : IActionFilter 
{ 
    private readonly Func<Type, IEnumerable> container; 

    public ActionFilterDispatcher(Func<Type, IEnumerable> container) 
    { 
     this.container = container; 
    } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     var attributes = context.Controller.GetType().GetCustomAttributes(true); 

     attributes = attributes.Append(/* how to read attributes from action method? */); 

     foreach (var attribute in attributes) 
     { 
      Type filterType = typeof(IActionFilter<>).MakeGenericType(attribute.GetType()); 
      IEnumerable filters = this.container.Invoke(filterType); 

      foreach (dynamic actionFilter in filters) 
      { 
       actionFilter.OnActionExecuting((dynamic)attribute, context); 
      } 
     } 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Moje pytanie brzmi: w jaki sposób mogę odczytać atrybuty metody działania w ASP.NET MVC rdzenia?

+0

Dostaniesz 'MemberInfo' dla jakiejkolwiek metody, którą chcesz użyć interfejsu API do refleksji, następnie użyj' GetCustomAttributes' na tym. Mam nadzieję, że nie pomylę się z pytaniem: –

+0

@Asad: pokaż mi. – Steven

Odpowiedz

36

Możesz uzyskać dostęp do MethodInfo działań przez klasę ControllerActionDescriptor:

public void OnActionExecuting(ActionExecutingContext context) 
{ 
    var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; 
    if (controllerActionDescriptor != null) 
    { 
     var actionAttributes = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true); 
    } 
} 

MVC 5 ActionDescriptor klasę wykorzystywany do implementacji interfejsu ICustomAttributeProvider który dał dostęp do atrybutów. Z jakiegoś powodu zostało to usunięte w klasie ASP.NET Core MVC ActionDescriptor.

+0

Jak to zrobić w asp.net mvc 6 – MichaelMao

+0

To jest o MVC 6 (lub Core 1.0). –

+0

Mój błąd nie wyglądał jasno. Czy możesz sprawdzić moją odpowiedź, czy nie? Po prostu znajduję sposób na zdobycie atrybutu i opublikuję go. – MichaelMao

3

Stworzyłem metodę rozszerzenia, która naśladuje oryginał GetCustomAttributes w oparciu o rozwiązanie Henk Mollema.

public static IEnumerable<T> GetCustomAttributes<T>(this Microsoft.AspNet.Mvc.Abstractions.ActionDescriptor actionDescriptor) where T : Attribute 
    { 
     var controllerActionDescriptor = actionDescriptor as ControllerActionDescriptor; 
     if (controllerActionDescriptor != null) 
     { 
      return controllerActionDescriptor.MethodInfo.GetCustomAttributes<T>(); 
     } 

     return Enumerable.Empty<T>(); 
    } 

Mam nadzieję, że to pomaga.

3

Mój atrybut niestandardowy dziedziczy po ActionFilterAttribute. Wrzuciłem go na kontroler, ale jest jedna akcja, która go nie potrzebuje. Chcę użyć atrybutu AllowAnonymous, aby to zignorować, ale nie działa. Dodaję ten fragment w moim niestandardowym atrybucie, aby znaleźć AllowAnonymous i pominąć go. Możesz uzyskać inne w pętli for.

public class PermissionAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
      foreach (var filterDescriptors in context.ActionDescriptor.FilterDescriptors) 
      { 
       if (filterDescriptors.Filter.GetType() == typeof(AllowAnonymousFilter)) 
       { 
        return; 
       } 
      } 
     } 
    } 
+0

Właściwość 'FilterDescriptors' działa tylko wtedy, gdy atrybut niestandardowy to w rzeczywistości [Filtr MVC] (https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters). Jeśli masz niestandardowy [atrybut pasywny] (http://blog.ploeh.dk/2014/06/13/passive-attributes/) zastosowany do akcji, to oczywiście twoje rozwiązanie nie będzie działać. – QuantumHive

Powiązane problemy