扫描站点中的所有操作

时间:2013-04-05 22:04:07

标签: asp.net-mvc asp.net-mvc-4 navigation

如何为网站中的所有操作创建操作链接?
我想将这些动作链接放入菜单系统。

我希望自己可以做点什么

foreach controller in controllers {
    foreach action in controller{
        stringbuilder.writeline(
            "<li>"+actionlink(menu, action, controller)+"<li>"
        );
    }
}

2 个答案:

答案 0 :(得分:2)

这是我的看法:

var controllers = Assembly.GetCallingAssembly().GetTypes().Where(type => type.IsSubclassOf(typeof(Controller))).ToList();
var controlList = controllers.Select(controller =>
                                     new
                                     {
                                         Actions = GetActions(controller),
                                         Name = controller.Name,
                                     }).ToList();

方法GetActions如下:

public static List<String> GetActions(Type controller)
{
    // List of links
    var items = new List<String>();

    // Get a descriptor of this controller
    var controllerDesc = new ReflectedControllerDescriptor(controller);

    // Look at each action in the controller
    foreach (var action in controllerDesc.GetCanonicalActions())
    {
        // Get any attributes (filters) on the action
        var attributes = action.GetCustomAttributes(false);

        // Look at each attribute
        var validAction =
            attributes.All(filter => !(filter is HttpPostAttribute) && !(filter is ChildActionOnlyAttribute));

        // Add the action to the list if it's "valid"
        if (validAction)
           items.Add(action.ActionName);
    }
    return items;
}

如果您需要一个菜单​​系统结帐MVC Sitemap Provider,它将根据您在会员实施中定义的角色,绝对控制要呈现的内容。

答案 1 :(得分:0)

以下是如何从控制器Asp.net Mvc: List all the actions on a controller with specific attributeAccessing the list of Controllers/Actions in an ASP.NET MVC application获取所有操作的方法 为了实现您的目标,您应该使用Assembly.GetExportedTypes()找到项目中的所有控制器,并仅过滤ControllerBase的子类,并从第二个链接过滤每个控制器调用new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions()