我正在创建一个ASP.NET MVC4应用程序,它有一个左侧菜单面板,右侧主面板将是内容面板。 (@RenderBody
)
菜单上的链接是根据用户的登录角色生成的。例如,具有更高访问权限的用户将在菜单上看到更多链接。这些访问权限存储在数据库中。
我有一个_Layout.cshtml
页面,我的所有页面都继承自此页面。
我应如何对访问菜单进行编码,以便在登录期间仅从数据库中检索一次访问权限?之后,用户导航到的每个页面,我都不必重新查询数据库的访问权限。
我应该在访问菜单页面使用Html.RenderAction
或Html.Partial
吗?
答案 0 :(得分: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.
}
答案 1 :(得分:0)
RenderAction
的想法在逻辑上是正确的。只需将OutputCache
添加到VaryByCustom
,您可以在其中检查角色,而不是为每个页面和用户访问数据库。
可以帮助您的链接:
答案 2 :(得分:0)
我认为最简单的方法是使用MVCSiteMapProvider,您可以使用NuGet添加到项目中。
它有一个选项securityTrimmingEnabled
,它会自动删除用户无权从站点地图中查看的项目,从而从菜单中删除。
我应如何对访问菜单进行编码,以便在登录期间仅从数据库中检索一次访问权限?
您应该使用RoleProvider获取您的角色。如果您拥有自己的角色数据库架构,则可能需要编写自定义角色提供程序。自定义角色提供程序可以实现缓存以避免过于频繁地访问数据库,或者,只要角色不是太多,就可以使用CacheRolesInCookie属性。
然后在应该保护的控制器和操作上放置Authorize
属性:
[Authorize(Roles="SomeRole")]
public ActionResult MyAction()
{
...
}