Building an ASP.NET MVC Master Page Menu Dynamically, Based on the current User's "Role"

I asked this on Stack Overflow:

I’ve seen some similar questions, but none that look like what I’m trying to do.

This is my current implementation w/out any security:

<div id="menucontainer">
    <ul id="menu">              
        <li><%= Html.ActionLink("Main List", "Index", "AController")%></li>
        <li><%= Html.ActionLink("Product List", "Index", "BController")%></li>
        <li><%= Html.ActionLink("Company List", "Index", "CController")%></li>
        <li><%= Html.ActionLink("User List", "Index", "DController")%></li>
    </ul>
</div>

This is fine, and the above works. I have [Authorize] Attributes setup on the Actions for CController and DController to prevent unauthorized access — but I’d like to remove those items from the menu for users who don’t have the correct Role, because when they see it and click on it and it tells them they don’t have permission, they’ll want it. If they don’t know it’s there, that’s just better for everyone involved…

Something like this is ultimately the goal I’m trying to get at, but I’m looking for the more MVC Flavored aproach, where the “view” is “dumb”:

<div id="menucontainer">
    <ul id="menu">              
        <li><%= Html.ActionLink("Main List", "Index", "AController")%></li>
        <li><%= Html.ActionLink("Product List", "Index", "BController")%></li>
        <% If(Role = Roles.Admin) { %>
        <li><%= Html.ActionLink("Company List", "Index", "CController")%></li>
        <li><%= Html.ActionLink("User List", "Index", "DController")%></li>
        <% } %>
    </ul>
</div>

jeroenh answered (15 upvotes):

I have done something like this:

  • use a common base class for my controllers (‘layer supertype’)
  • in the BaseController, override OnActionExecuted (you could also define an ActionFilter attribute for this)

Something like this:

    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"] = menu;
    }

In the master page:

    <% var model = ViewData["Menu"] as IEnumerable<MenuItem>; %>
    <% Html.RenderPartial("Menu", model); %>

(Note: in reality, I have a MasterViewModel that contains among others the menu model)

Notable comments

Nate (0 upvotes): I am… I think. There are two levels of user, Normal and Admin. Only admin can see Company and User lists, the [Authorize] attributes on the controller prevent unauthorized access, but I want to hide the view from non-Admin’s so they don’t even get the idea that its there in their head.


Originally posted on Stack Overflow — 15 upvotes. Licensed under CC BY-SA.

signed letter b

Dad. Geek. Gamer. Software developer. Cloud user. Old Car enthusiast.  Blogger.


Top Posts


profile for Nate on Stack Exchange, a network of free, community-driven Q&A sites
a proud member of the blue team of 512KB club
Thoughts, opinions, and ideas shared here are my own. © 2026 Nate Bross.