2009-08-31 12 views
8

ダイナミックなGoogleサイトマップを作成するために、すべてのコントローラとそのアクションを特定の属性で表示しようとしています。そのため、属性を持つ特定のアクションを「マーク」してサイトマップに表示することができます。Asp.net Mvc:特定の属性を持つコントローラのすべてのアクションを一覧表示する

Hereすべてのコントローラを取得する方法を知りました。しかし、特定の属性を持つすべてのアクションを取得する方法がわかりません。私はGetMethodsを試してGetCustomAttributesを使用しましたが、それが正しい方法であるかどうかはわかりません。それは少し複雑に感じた。

私がコントローラとそのアクションを取得したら、私はhereというテクニックを使ってURLを取得しようとしていました。エリック・ダンカンが、私がその質問で達成しようとしていることについて話し合っていることにお気づきのように。

ありがとうございます。

答えて

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)) 
     { 
      ... 
     } 
    } 
} 
関連する問題