0

我正在创建一个具有左侧菜单面板的 ASP.NET MVC4 应用程序,右侧主面板将是内容面板。( @RenderBody)

菜单上的链接是根据用户的登录角色生成的。例如,具有较高访问权限的用户将在菜单上看到更多链接。这些访问权限存储在数据库中。

我有一个_Layout.cshtml页面,我的所有页面都继承自该页面。

我应该如何编码我的访问菜单,以便在登录期间仅从数据库中检索一次访问权限?之后,用户导航到的每个页面,我都不必重新查询数据库以获得他的访问权限。

我应该使用Html.RenderAction还是Html.Partial访问我的访问菜单页面?

4

3 回答 3

0

您可以在 Shared 文件夹中定义一个名为“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.  
}
于 2012-10-30T07:27:12.900 回答
0

你的想法在RenderAction逻辑上是正确的。只需添加OutputCachewith VaryByCustom,您可以在其中检查角色并且不访问每个页面和用户的数据库。

对您有帮助的链接:

于 2012-10-30T07:34:55.147 回答
0

我想说最简单的方法是使用MVCSiteMapProvider ,您可以使用NuGet添加到您的项目中。

它有一个选项securityTrimmingEnabled可以自动删除用户无权从站点地图和菜单中查看的项目。

我应该如何编码我的访问菜单,以便在登录期间仅从数据库中检索一次访问权限?

您应该使用RoleProvider获取您的角色。如果您有自己的角色数据库架构,则可能需要编写自定义角色提供程序。自定义角色提供者可以实现缓存以避免过于频繁地访问数据库,或者,只要角色不多,您可以使用CacheRolesInCookie属性。

然后Authorize在应该保护的控制器和操作上放置一个属性:

[Authorize(Roles="SomeRole")]
public ActionResult MyAction()
{
    ...
}
于 2012-10-30T07:49:40.227 回答