也许在进入标题问题之前我应该备份并扩大范围......
我目前正在ASP.NET MVC 1.0中编写一个Web应用程序(虽然我的PC上安装了MVC 2.0,所以我并不完全限于1.0) - 我已经开始使用标准的MVC项目了基本的"欢迎使用ASP.NET MVC",并在右上角显示[Home]选项卡和[About]选项卡.很标准,对吗?
我添加了4个新的Controller类,我们称之为"天文学家","生物学家","化学家"和"物理学家".附加到每个新控制器类的是[Authorize]属性.
例如,对于BiologistController.cs
[Authorize(Roles = "Biologist,Admin")]
public class BiologistController : Controller
{ 
    public ActionResult Index() { return View(); }
}
这些[授权]标签自然限制哪些用户可以根据角色访问不同的控制器,但我想根据用户所属的角色在Site.Master页面的网站顶部动态构建一个菜单.例如,如果"JoeUser"是角色"天文学家"和"物理学家"的成员,导航菜单会说:
[主页] [天文学家] [物理学家] [关于]
当然,它不会列出"生物学家"或"化学家"控制器索引页面的链接.
或者,如果"JohnAdmin"是角色"Admin"的成员,则所有4个控制器的链接将显示在导航栏中.
好吧,你们大家都有了想法......现在回答真正的问题......
从这个关于ASP.NET中动态菜单构建的StackOverflow主题的答案开始,我试图理解如何完全实现它.(我是新手,需要更多指导,所以请和我一起去.)
答案建议扩展Controller类(称之为"ExtController"),然后让每个新的WhateverController继承自ExtController.
我的结论是我需要在这个ExtController构造函数中使用Reflection来确定哪些类和方法附加了[Authorize]属性来确定角色.然后使用静态字典,将角色和控制器/方法存储在键值对中.
我想它是这样的:
public class ExtController : Controller
{
    protected static Dictionary<Type,List<string>> ControllerRolesDictionary;
    protected override void OnActionExecuted(ActionExecutedContext filterContext)   
    {   
        // build list of menu items based on user's permissions, and add it to ViewData  
        IEnumerable<MenuItem> menu = BuildMenu();  
        ViewData["Menu"] …我正在编写我的第一个MVC 3应用程序(在ASP.NET中),我不知道如何(应该)显示不同用户的菜单.
我的应用程序创建为MVC3 Web应用程序,菜单如下所示:
<div id="menucontainer">
            <ul id="menu">
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
                <li>@Html.ActionLink("Info", "Info", "Home")</li>
            </ul>
</div>
我创建了两种类型的角色:用户和管理员.现在,我想为用户(项目,个人资料)和管理员(管理项目,管理帐户,管理新闻)显示另一个链接.
我应该怎么做?