在视图中使用 User.IsInRole()

Usage of User.IsInRole() in a View

在我的 mvc5 项目中,为未经授权的用户禁用操作 link 我确实喜欢这样做

@if (User.IsInRole("Admin") | User.IsInRole("Manager"))
{ 
        @Html.ActionLink("Add New Record", "ProductTypeIndex", "ProductType")
} 

但是如果要检查的角色很多,那么这个@if() 就会变长。如何避免这种情况?我是否需要自定义助手(如果是这样,我该如何处理)?帮助赞赏..

<% if (Page.User.IsInRole("Admin")){ %>

您可以编写自己的扩展方法并在您的代码中使用它。

public static class PrincipalExtensions
{
    public static bool IsInAllRoles(this IPrincipal principal, params string[] roles)
    {
        return roles.All(r => principal.IsInRole(r));
    }

    public static bool IsInAnyRoles(this IPrincipal principal, params string[] roles)
    {
        return roles.Any(r => principal.IsInRole(r));
    }
}

现在您可以像这样简单地调用此扩展方法:

// user must be assign to all of the roles  
if(User.IsInAllRoles("Admin","Manager","YetOtherRole"))
{
    // do something
} 

// one of the roles sufficient
if(User.IsInAnyRoles("Admin","Manager","YetOtherRole"))
{
    // do something
} 

虽然您也可以在视图中使用这些扩展方法,但尽量避免在视图中编写您的应用程序逻辑,因为视图不容易进行单元测试。