基于角色的导航

9

我一直在尝试想出一种创建动态角色导航解决方案的方法,用于我正在开发的项目。

导航应该仅显示与用户角色相关的链接,例如:管理员将拥有查看应用程序统计信息、管理客户账户等链接,而普通用户将拥有管理其账户、与朋友沟通等链接。

目前,我有一个名为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

有没有办法将这个逻辑从视图中拿出来,让控制器处理?

1
您的Partial使用了子Action方法吗? - Dave Alperovich
谢谢 Dave。不,它不会。我以前没有真正使用过 Child Actions。您介意详细解释一下您的问题吗?我不确定在这种情况下 Child Actions 会扮演什么角色。 - matt.
4
子操作很好用。它们是将模型部分传递回给你的操作。你可以使用 Action("/Controller/Action/id") 来调用它们。id 部分可以是你想要创建哪个导航栏的句柄,而模型可以是导航项的列表。更好的是,你的子操作可以在没有参数的情况下查找用户角色并返回正确的导航栏。我以前就用过这种方法来进行基于角色的导航。 - Dave Alperovich
1个回答

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");
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接