views:

190

answers:

1

Hello,
I am trying to list all the controllers and their actions with specific attributes to create a dynamic google sitemap. So that I can "mark" certain actions with an attribute so they show up in the sitemap.

Here I found out how to get all the controllers. But I am not sure how to get all their Actions with a particular attribute. I tried GetMethods and then use GetCustomAttributes but I am not sure if that's the right way to do it. It felt a little over complicated.

Once I get the controllers and their actions I was going to use the technique explained here to get the urls. As you may notice Eric Duncan talks about what I am trying to accomplish in that question.

Thanks in advance.

+2  A: 

I use some code in my unit tests to verify that certain actions are decorated with attributes. It uses reflection with some enumerable extension method goodness. I think you could adapt this. Note, if you only care about whether it exists or not, you could use Count() on the enumeration rather than getting the actual attribute. This way allows you some flexibility in using attribute properties to customize the behavior. Using the inheritance tree would allow you to decorate an entire 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 ))
        {
            ...
        }
    }
}
tvanfosson