在mvc中查找控制器名称和操作名称列表

时间:2012-06-02 09:16:44

标签: asp.net-mvc drop-down-menu action controllers

我有一个导航页面,我想当点击创建导航我显示下拉列表 包括控制器名称和选择一个控制器,然后在另一个下拉列表中显示相关的操作

那么如何才能找到我的控制器名称和动作?

1 个答案:

答案 0 :(得分:2)

我确实为控制器和行动做了沉重的工作。此代码生成包含列表项的无序列表,可以在视图中删除。您可以使用自己喜欢的jquery menu plugin将此列表转换为具有所需效果的菜单。

此代码可以轻松地重构为使用控制器和(部分)视图的解决方案,以防您需要重复使用此代码段。

<ul>
@{
    var allTypes = 
            from asm 
            in AppDomain.CurrentDomain.GetAssemblies()
            let types = (
                from type 
                in asm.GetTypes()
                let contname = type.Name.Replace("Controller","")
                let methods = (
                    from method 
                    in type.GetMethods()
                    let hasHttpPost =
                        method.GetCustomAttributes(
                            typeof(HttpPostAttribute),
                            false).Length > 0
                    where (method.ReturnType.IsSubclassOf(
                                    typeof(ActionResult))
                    || method.ReturnType == typeof(ActionResult))
                    && !hasHttpPost
                    select new
                    {
                        Controller = contname,
                        Action = method.Name
                    }
                )
                where type.IsSubclassOf(typeof(Controller))
                select new {Name = contname, Controllers = methods }
                )
            select new { asm.FullName, AllControllers = types };


    foreach (var controllers in allTypes)
    {
        foreach (var controller in controllers.AllControllers)
        {
            <li>
            @controller.Name
            <ul>
            @{
            foreach (var controlleraction in controller.Controllers)
            {
              <li>
                <a href="@controlleraction.Controller/@controlleraction.Action">
                  @controlleraction.Action
                </a>
              </li>
            }
            }
            </ul>
            </li>
        }
    }
}
</ul>