【发布时间】:2012-01-14 17:20:50
【问题描述】:
我正在开发一个 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", "Index", "Admin")</li>
}
}
我想把它重构为更易读的东西,并想出了这样的东西
@if ((bool)ViewData["MenuMyLearning"]){<li id="MyLearningTab">@Html.ActionLink("My Learning", "MyLearning", "Learning")</li> }
@if((bool)ViewData["MenuReports"]){<li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li>}
@if ((bool)ViewData["MenuDashboard"]){<li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li>}
@if ((bool)ViewData["MenuAdmin"]){<li id="AdminTab">@Html.ActionLink("Admin", "Index", "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 代码保持原样?
【问题讨论】:
标签: asp.net-mvc-3 asp.net-membership