我一直在尝试为我正在开发的项目创建一个基于动态角色的导航解决方案。
导航应仅显示与用户角色相关的链接,例如:管理员将具有查看应用程序统计信息,管理客户帐户等的链接,而标准用户则会有链接来管理他们的帐户,与朋友沟通等。
我目前只有一个名为 Navigation 的局部视图,其中包含一些用于角色检查的基本条件语句以及用于显示相应链接的混合标记。这有效,但是,我知道它很快就会变得无法管理。
导航部分视图:
@if(User.IsInRole("Admin")) {
<li><a href="#">Statistics</a></li>
<li><a href="#">Accounts</a></li>
<li><a href="#">Dashboard</a></li>
}
@if(User.IsInRole("User")) {
<li><a href="#">Account</a></li>
<li><a href="#">Friends</a></li>
}
// code omitted
有没有办法让这个逻辑退出视图并让Controller处理这个?
答案 0 :(得分:14)
<强>解强>
根据建议,我创建了一个名为Menu的ChildAction和每个角色的部分视图。在操作中,我使用一些条件语句进行角色检查并渲染适当的视图。
这使条件语句不在视图之外,这使得它成为一个更清洁的解决方案。
我确信可以采取一些措施来整理它,我会继续努力改进它。
这是我使用的解决方案。
在我希望菜单出现的布局视图中,我使用了它。
@Html.Action("Menu", "Navigation")
然后我创建了一个名为Navigation的控制器,并添加了一个名为Menu的Action。
public class NavigationController : Controller
{
[ChildActionOnly]
public ActionResult Menu()
{
if (Roles.IsUserInRole("Administrator"))
{
return PartialView("_NavigationAdmin");
}
return PartialView("_NavigationPublic");
}
}