2009-08-31 7 views
8

Sto cercando di elencare tutti i controller e le loro azioni con attributi specifici per creare una sitemap dinamica di google. In modo che io possa "contrassegnare" determinate azioni con un attributo in modo che vengano visualizzate nella mappa del sito.Asp.net Mvc: elenca tutte le azioni su un controller con attributo specifico

Here Ho scoperto come ottenere tutti i controller. Ma non sono sicuro di come ottenere tutte le loro azioni con un particolare attributo. Ho provato GetMethods e quindi utilizzare GetCustomAttributes ma non sono sicuro se questo è il modo giusto per farlo. Sembrava un po 'complicato.

Una volta ottenuti i controller e le relative azioni, avrei utilizzato la tecnica spiegata here per ottenere gli URL. Come puoi notare, Eric Duncan parla di ciò che sto cercando di ottenere in quella domanda.

Grazie in anticipo.

risposta

17

Uso un codice nei test di unità per verificare che alcune azioni siano decorate con attributi. Usa la riflessione con un po 'di bontà del metodo di estensione enumerabile. Penso che potresti adattare questo. Nota, se ti interessa solo se esiste o meno, puoi usare Count() sull'enumerazione piuttosto che ottenere l'attributo attuale. In questo modo ti consente una certa flessibilità nell'utilizzo delle proprietà degli attributi per personalizzare il comportamento. L'utilizzo dell'albero di ereditarietà ti consente di decorare un intero controller.

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)) 
     { 
      ... 
     } 
    } 
} 
Problemi correlati