簡體   English   中英

基於當前用戶的“角色”動態構建ASP.NET MVC主頁面菜單

[英]Building an ASP.NET MVC Master Page Menu Dynamically, Based on the current User's “Role”

我見過一些類似的問題,但沒有一個看起來像我正在嘗試做的事情。

這是我當前的實施,沒有任何安全性:

<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>

這很好,以上工作。 我在Actions for CController和DController上設置[授權]屬性以防止未經授權的訪問 - 但是我想從菜單中刪除那些沒有正確角色的用戶,因為當他們看到它並點擊時在它上面它告訴他們他們沒有許可,他們會想要它。 如果他們不知道那里,那對所有參與者來說都更好......

這樣的事情最終是我想要達到的目標,但我正在尋找更多MVC風味的方法,其中“視圖”是“愚蠢的”:

<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>

我做過這樣的事情:

  • 為我的控制器使用公共基類('layer supertype')
  • 在BaseController中,重寫OnActionExecuted(你也可以為此定義一個ActionFilter屬性)

像這樣的東西:

    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;
    }

在母版頁中:

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

(注意:實際上,我有一個MasterViewModel,其中包含菜單模型)

沒有人提到過MvcSiteMapProvider ,它可以使用NuGet輕松集成到Visual Studio項目中。

你聽說過MvcContrib的MenuBuilder嗎?

如果沒有,我建議你看一下。 示例項目UI是開始學習如何使用它的好方法。

通常我只是以你做過的方式檢查角色,然后用鏈接渲染局部視圖或者只是創建它們。 使用Razor語法這樣的東西。 我使用T4MVC進行操作。

@if(User.IsInRole("Admin"))
{
    <li><a href="@Url.Action(MVC.Admin.User.Index())">Users</a></li>
}

為了安全起見,我使用了Fluent Security。 希望這可以幫助。

到目前為止,喬的解決方案是最簡單的,對我有用。 我有頁面存在於不同的區域,我需要快速設置一個菜單系統,根據用戶所在的區域做出反應和工作。另外在我的情況下,我的系統中沒有跨區域鏈接,所以我要去接下來為MvcSiteMapProvider配置多個站點地圖

希望這可以幫助其他人尋找簡單有效的解決方案!

就像@SD“所說的那樣,你可以創建一個”閃亮的“幫助器,根據你的安全要求,不管是否呈現鏈接。

這是一個關於自定義助手的好讀物(底部):

在S. Walther的博客上了解-html-helpers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM