扫描站点中的所有行动(Scan for all actions in the site)

2019-10-17 23:11发布

如何创建站点中的所有操作动作链接?
我希望把这些动作链接到一个菜单系统。

我希望我可以这样做

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

Answer 1:

这是我对此采取:

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站点地图提供者 ,它会给你上取决于你在你的会员实现中定义的角色是什么来呈现绝对的控制权。



Answer 2:

这里是方法如何从控制器的所有操作Asp.net MVC框架:具有特定属性的控制器上列出所有的动作或访问控制器列表/在ASP.NET MVC应用程序操作为实现你的目标,你应该找到的所有控制器的与项目Assembly.GetExportedTypes()和过滤器的子类ControllerBase和每个控制器调用new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions()从第二链接。



文章来源: Scan for all actions in the site