2009-08-31 86 views
8

我想列出所有控制器及其具有特定屬性的操作,以創建動態Google站點地圖。這樣我就可以用屬性「標記」某些動作,以便它們顯示在站點地圖中。Asp.net Mvc:列出具有特定屬性的控制器上的所有操作

Here我發現如何獲得所有的控制器。但我不確定如何使用特定屬性獲取所有操作。我試過GetMethods,然後使用GetCustomAttributes,但我不確定這是否正確。這感覺有點過於複雜。

一旦我得到控制器和他們的行動,我將使用解釋here的技術來獲取網址。正如你可能注意到埃裏克鄧肯談論我在這個問題上想要完成的事情。

在此先感謝。

回答

17

我在我的單元測試中使用了一些代碼來驗證某些動作是用屬性裝飾的。它使用反射與一些枚舉擴展方法善良。我想你可以適應這一點。請注意,如果您只關心它是否存在,則可以在枚舉上使用Count()而不是獲取實際屬性。通過這種方式,您可以靈活地使用屬性屬性來自定義行爲。使用繼承樹可以讓你裝飾整個控制器。

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)) 
     { 
      ... 
     } 
    } 
} 
相關問題