【问题标题】:Role specific controls in Views视图中的角色特定控件
【发布时间】:2014-09-15 01:37:15
【问题描述】:

我正在尝试根据用户的角色隐藏控件。我曾经能够做类似的事情

@if (User.IsInRole("Admin"))
            {Html.ActionLink("RolesAdmin", "Index", "RolesAdmin")}

在视图中,但这似乎不再起作用。经过大量挖掘,我发现 Identity 2.0 根本不使用这个。

还有什么我可以直接从视图中使用的吗?还是我这样做完全错了?

【问题讨论】:

标签: asp.net asp.net-mvc-5 asp.net-identity


【解决方案1】:

这应该仍然可以正常工作,因为身份样本当前正在执行类似于仅显示“管理员”的顶级链接的操作

            @if (Request.IsAuthenticated && User.IsInRole("Admin")) {
                <li>@Html.ActionLink("RolesAdmin", "Index", "RolesAdmin")</li>
                <li>@Html.ActionLink("UsersAdmin", "Index", "UsersAdmin")</li>
            }

【讨论】:

  • 这些类型的条件语句并不真正属于视图。控制器应该处理这个。
  • 在这失控之前,nwdev 的观点是正确的,将角色检查代码放在视图中违反了 MVC 模式,所以这个问题(和身份样本)没有遵循 MVC 的最佳实践在这种情况下。
【解决方案2】:

这种类型的逻辑最好放在控制器中,让视图进行渲染。

您可以在控制器中使用 Html.Action 和 ChildAction 的组合,并根据用户角色呈现部分视图。

前段时间我发了一个类似的问题,觉得对你有帮助。

Role Based Navigation

-编辑-

为了澄清,这可以使用新的 ASP.NET 标识

这将进入布局

@Html.Action("BuildNavigation", "Component")

这将是你的控制器。

public class ComponentController : Controller
{

    [ChildActionOnly]
    public ActionResult BuildNavigation()
    {

        if (this.User.IsInRole("customer"))
        {
            return PartialView("_NavigationCustomer");
        }
        else
        { 
            return PartialView("_NavigationBasic"); 
        }


    }
}

这应该会让你朝着正确的方向前进。

【讨论】:

  • 这是一个不错的解决方案,我立即将其放入,因为这正是我想要的,但不幸的是,当我尝试运行它时,我得到:“角色管理器功能尚未启用”。我昨天一直在这条路上,我发现的所有帖子都建议我在我的 web.config 中添加一个 RoleManager,这似乎也是一个死胡同。
  • 我使用 this answer 让它工作
  • Hao 下面的解决方案不需要维护两个不同的视图。简单的显示/不显示逻辑在视图中很好。查看 Views\Shared_LoginPartial.cshtml 视图,它具有类似的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多