如何从母版页中动态列出现有的操作控制器?

时间:2010-09-13 07:26:20

标签: asp.net-mvc model-view-controller

我想列出母版页中的所有现有控制器。

例如:

在我的Controller文件夹中,我有:

  1. HomeController with actions Index等...
  2. 带有操作索引,详细信息等的ProductController ......
  3. 带有动作索引,编辑等的ServiceController ......
  4. 带有动作索引,更新等的SomethingController ......
  5. 在我的Site.master中,我想动态列出所有这些Action控制器。

2 个答案:

答案 0 :(得分:2)

虽然我完全赞同@ Darin的response,但使用ViewData这是一个相对简单的方法来做你所要求的。

关于枚举所有控制器的实际逻辑。我不会在此处添加,因为this是一种合理的方式,我可能无法改进。

您可以使用ViewData执行某些操作,以便从OnActionExecuting动态存储所有控制器和操作。您必须创建一个新控制器,所有其他控制器都将从该控制器继承。

因此,例如,使用ProductController:

public class ProductController : MyCustomController
{
  ...
}

...

public class MyCustomController : Controller
{
  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    base.OnActionExecuting(filterContext);

    //Some logic (not written) to reflect each of the controllers and actions. Probably something utilising IGrouping.
    var controllersActions = GetControllersActions();

    //Drop your collection into the ControllersActions.
    filterContext.Controller.ViewData.Add("ControllersActions", controllersActions);
  }
}

在您的母版页中......

<% var controllersActions = ViewData["ControllersActions"]; %>

... outputting your controllers/actions ...

答案 1 :(得分:1)

  

在我的Site.master中,我想动态列出所有这些Action控制器。

视图不应该提取数据。它们应该显示由控制器传递的数据/模型。因此,在控制器中,您可以使用反射列出从Controller派生的所有类型,并将它们传递给视图进行渲染。另一种可能性是拥有一个可以完成工作的HTML帮助程序。