2012-07-19 72 views
0

我想在我的MVC應用程序中使用Jquery創建導航菜單。我正在使用http://users.tpg.com.au/j_birch/plugins/superfish/JQuery導航菜單授權

但是,我想顯示基於用戶角色的菜單項,即包括asp會員授權邏輯,以便如果用戶不具備所需的角色,他不會看到某些菜單項。

任何人都可以建議如何繼續。

感謝

+0

我不知道我可能是錯的,但我認爲菜單將是可見的,如果誰亙古不變的用戶有權限訪問特定頁面單擊他可能重定向到拒絕訪問頁面的菜單項,再次點擊我的意見。 – freebird 2012-07-19 12:57:34

+0

是的,可以完成,但如果用戶不被允許查看頁面,我不想顯示菜單項本身。不管怎麼說,還是要謝謝你。 – gunnerz 2012-07-19 13:03:57

回答

2

由於快魚只能你需要確保它只有在首位,其中定義服務器端右HTML客戶端。

你的角色提供者有一個IsUserInRole和GetRolesForUser。你可以用它來建立HTML。

例如:

@if (RoleProvider.IsUserInRole(user.username, "admin")) { 
    <li>Admin<li> 
} 
+0

正如其他評論指出的,我上面所做的並不一定是最有效的,但它很簡單明瞭,並且確保客戶永遠不會看到他們不應該看到的菜單項。對於您而言,用戶絕對不應該看到的菜單項甚至不會放到瀏覽器中,這對您來說可能是一個安全考慮因素。 (當然,關閉javascript只會讓你的菜單變醜,但它仍然會有正確的項目。)你一定要考慮緩存響應,儘管IsUserInRole通常會被緩存,所以每次訪問都不會導致數據庫查找。 – 2012-07-19 13:57:08

1

如果在數據庫中設置了,那麼你可以創建表,一個表將包含菜單和其他人會用映射角色菜單中的用戶/角色。

您可能必須創建一個子查詢操作,該操作將查詢數據庫獲取特定角色的菜單項並通過局部視圖呈現菜單。您甚至可以在會話中爲用戶保留菜單項,並且通過這種方式可以避免在每個請求中觸及數據庫。

隱藏菜單項部分解決了問題。您必須使用授權過濾器來保護控制器和操作。

1

更新:如果你正在做很多客戶端的東西,並只與數據通信的MVC應用程序,這個答案更合適。如果您要渲染服務器上的每一頁,請使用Steve的答案。

我認爲您需要使用返回JsonResult的控制器操作將用戶角色傳達給客戶端。例如。

public class SecurityController : Controller 
{ 
    public ActionResult Roles() 
    { 
     return new JsonResult 
     { 
      Data = System.Web.Security.Roles.GetRolesForUser(), 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
} 

然後使用$.ajax檢索數據客戶端,並在回調從不符合您的要求的DOM刪除節點。例如。

<ul id="menu"> 
     <li data-roles="Administrator"> 
      Secured 
     </li> 
     <li>Any</li> 
    </ul> 
    <script type="text/javascript"> 
     $.ajax({ 
      url: "security/roles", 
      success: function(roles) { 
       $("#menu li[data-roles]").filter(function() { 
        var requiredRoles = (this.attr("data-roles") || "").split(","); 
        for (var requiredRole in requiredRoles) { 
         if (roles.indexOf(requiredRole) >= 0) { 
          return false; 
         } 
        } 

        return true; 
       }).remove(); 

       // TODO call your menu plugin here 
       // $("#menu").superfish(); 
      }, 
      error: function() { 
       $("#menu li[data-roles]").remove(); 
      } 
     }); 
    </script> 

乾杯, 院長