如何为网站中的所有操作创建操作链接?
我想将这些动作链接放入菜单系统。
我希望自己可以做点什么
foreach controller in controllers {
foreach action in controller{
stringbuilder.writeline(
"<li>"+actionlink(menu, action, controller)+"<li>"
);
}
}
答案 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 attribute或Accessing the list of Controllers/Actions in an ASP.NET MVC application获取所有操作的方法
为了实现您的目标,您应该使用Assembly.GetExportedTypes()
找到项目中的所有控制器,并仅过滤ControllerBase
的子类,并从第二个链接过滤每个控制器调用new ReflectedControllerDescriptor(typeof(TController)).GetCanonicalActions()
。