我一直在尝试为我正在开发的项目创建一个基于动态角色的导航解决方案.
导航应仅显示与用户角色相关的链接,例如:管理员将具有查看应用程序统计信息,管理客户帐户等的链接,而标准用户将拥有管理其帐户的链接,与朋友交流等等..
我目前有一个名为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处理这个?
解决方法
解
正如所建议的那样,我创建了一个名为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"); } }