asp.net-mvc-3 – ASP.Net MVC隐藏/显示基于安全性的菜单项

我在一个ASP.Net MVC 3网站上工作. _Layout主视图包含一个菜单,我想根据您登录内容以及您所处的角色隐藏菜单中的某些项目.

目前使用这样的代码

@if (HttpContext.Current.User.Identity.IsAuthenticated)
{
   <li id="MyLearningTab">@Html.ActionLink("My Learning","MyLearning","Learning")</li> 
   if (HttpContext.Current.User.IsInRole("Reporters"))
   {
      <li id="ReportTab">@Html.ActionLink("Reports","Index","Reports")</li>
   }
   if (HttpContext.Current.User.IsInRole("Administrators"))
   {
      <li id="DashboardTab">@Html.ActionLink("Dashboard","Dashboard","Admin")</li>
      <li id="AdminTab">@Html.ActionLink("Admin","Admin")</li> 
   }
}

我想重构这个更可读的东西,并提出了这样的东西

@if ((bool)ViewData["MenuMyLearning"]){<li id="MyLearningTab">@Html.ActionLink("My Learning","Learning")</li> }    
@if((bool)ViewData["MenuReports"]){<li id="ReportTab">@Html.ActionLink("Reports","Reports")</li>}
@if ((bool)ViewData["MenuDashboard"]){<li id="DashboardTab">@Html.ActionLink("Dashboard","Admin")</li>}
@if ((bool)ViewData["MenuAdmin"]){<li id="AdminTab">@Html.ActionLink("Admin","Admin")</li>}

我原来添加以下内容到我的基本控制器构造函数,以为我可以为这些属性设置ViewData

ViewData["MenuDashboard"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Administrators");
ViewData["MenuAdmin"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Administrators");
ViewData["MenuReports"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Reportors");
ViewData["MenuMyLearning"] = User != null && User.Identity.IsAuthenticated;

但是,在生命周期的这一点上,用户对象为空.我也试过创建一个自定义的全局过滤器,但ViewData然后是不可访问的.

做这样的推荐方法是什么?我应该离开它最初是在视图中的所有HttpContext代码

解决方法

这是我最后做的我为每个菜单项创建了一个名为MenuSecurity的辅助类,并显示哪些项目应该可见的静态布尔属性.每个房产都看起来像这样
public static bool DashboardVisible
{
   get 
   { 
      return 
         HttpContext.Current.User != null && 
         HttpContext.Current.User.Identity.IsAuthenticated; 
   }
}

然后我将菜单的部分视图整理为这样

@if (MenuSecurity.ReportsVisible){<li id="ReportTab">@Html.ActionLink("Reports","Reports")</li>}
@if (MenuSecurity.DashboardVisible){<li id="DashboardTab">@Html.ActionLink("Dashboard","Admin")</li>}
@if (MenuSecurity.AdminVisible){<li id="AdminTab">@Html.ActionLink("Admin","Admin")</li>}

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....