2009-08-31 12 views
8

Próbuję wyświetlić listę wszystkich kontrolerów i ich akcji z określonymi atrybutami, aby utworzyć dynamiczną mapę witryny google. Dzięki temu mogę "oznaczyć" określone akcje atrybutem, aby pojawiły się w mapie witryny.Asp.net Mvc: Lista wszystkich działań na kontrolerze o określonym atrybucie

Here Dowiedziałem się, jak zdobyć wszystkich kontrolerów. Ale nie jestem pewien, jak uzyskać wszystkie swoje Akcje z określonym atrybutem. Próbowałem GetMethods, a następnie używam GetCustomAttributes, ale nie jestem pewien, czy to jest właściwy sposób, aby to zrobić. To było trochę zbyt skomplikowane.

Kiedy otrzymam kontrolerów i ich działania, zamierzam użyć techniki wyjaśnionej here, aby uzyskać adresy URL. Jak można zauważyć, Eric Duncan mówi o tym, co próbuję osiągnąć w tym pytaniu.

Z góry dziękuję.

Odpowiedz

17

Używam kodu w testach jednostkowych, aby sprawdzić, czy niektóre akcje są ozdobione atrybutami. Używa refleksji z pewną dobrotliwością metody dobrobytu. Myślę, że możesz to zaadaptować. Zauważ, że jeśli zależy ci tylko na tym, czy istnieje, czy nie, możesz użyć Count() zamiast wyliczania rzeczywistego atrybutu. W ten sposób można uzyskać pewną elastyczność w korzystaniu z właściwości atrybutu w celu dostosowania zachowania. Korzystanie z drzewa dziedziczenia pozwoliłoby na dekorowanie całego kontrolera.

var methods= controller.GetType() 
         .GetMethods(BindingFlags.Public | BindingFlags.Instance) 
foreach (var info in methods) 
{ 
    if (info.ReturnType == typeof(ActionResult)) 
    { 
     var attribute = info.GetCustomAttributes(typeof(SiteMapAttribute), true) 
          .Cast<SiteMapAttribute>() 
          .FirstOrDefault(); 

     if (attribute != null && !attribute.Exclude.Contains(info.Name)) 
     { 
      ... 
     } 
    } 
} 
Powiązane problemy