2012-10-30 48 views
0

我創建具有左側菜單面板中的ASP.NET應用程序MVC4訪問權限,和右主面板將是內容面板。 (@RenderBody最佳實踐來查詢ASP.NET MVC應用程序

菜單上的鏈接生成基於用戶的登錄角色。例如,具有較高訪問權限的用戶將在菜單上看到更多鏈接。這些訪問權限存儲在數據庫中。

我有一個_Layout.cshtml網頁,其中我的所有網頁繼承。

我應該如何代碼,這樣的訪問只從數據庫登錄期間檢索一次,我訪問菜單?之後,用戶導航到的每個頁面,我不必爲他的訪問權限重新查詢數據庫。

我應該使用Html.RenderActionHtml.Partial我訪問菜單頁面?

+0

你怎麼想使用'HTML.RenderAction()'? – DarthVader

+0

RenderAction()調用一個查詢我的數據庫並返回包含菜單鏈接的視圖的控制器? –

回答

0

我說要做到這一點最簡單的方法是使用MVCSiteMapProvider,您可以添加使用NuGet項目。

它有一個選項securityTrimmingEnabled這將自動刪除該用戶無權從站點地圖,然後從菜單所以看項目。

我應該如何編碼我的訪問菜單,以便在登錄期間僅從數據庫檢索訪問權限?

你應該使用RoleProvider得到你的角色。如果您有自己的角色數據庫模式,則可能需要編寫一個自定義角色提供程序。自定義角色提供者可以實現緩存以避免過於頻繁地觸擊數據庫,或者,只要沒有太多角色,就可以使用CacheRolesInCookie屬性。

然後穿上控制器和動作的Authorize屬性,它應該受到保護:

[Authorize(Roles="SomeRole")] 
public ActionResult MyAction() 
{ 
    ... 
} 
+0

我可以避免使用硬編碼角色=「SomeRoles」,因爲在我的系統中,管理員可以添加更多角色。 –

+0

一種方法是創建一個自定義授權屬性:http://msdn.microsoft.com/en-us/library/ee707357(v=vs.91).aspx。 – Joe

0

您可以在共享文件夾中定義名爲'Navigation.cshtml'的局部視圖。而在你_Layout.cshtml,您可以撥打電話一樣

<div id="left-menu"> 
    @Html.Partial("Navigation") 
</div> 

和你Navigation.cshtml應該像

@if(Request.IsAuthenticated) { 
    // show links for authenticated user. 
} 
else { 
// show links for non-authenticated user. 
}