如何显示或隐藏基于角色的控件-ASP.NET MVC 4 Razor

如何显示或隐藏基于角色的控件-ASP.NET MVC 4 Razor,asp.net,.net,asp.net-mvc,authorization,windows-authentication,Asp.net,.net,Asp.net Mvc,Authorization,Windows Authentication,我正在开发ASP.NET MVC 4应用程序。我有一个仪表板,我的用户组将基于Windows域 因此,我使用WIndows身份验证对用户进行身份验证。 我创建了示例应用程序,它通过覆盖函数AuthorizeAttribute、ActionFilterAttribute使用自定义身份验证。这是一个好方法吗 哪个属性最适合用于身份验证 我有一个仪表盘。因此,我需要根据角色显示或隐藏控件。 假设有3个网格(表),如果管理员登录,他可以看到3个网格(表)。 但若支持用户登录,他只能看到2个网格(表) 我

我正在开发ASP.NET MVC 4应用程序。我有一个仪表板,我的用户组将基于Windows域 因此,我使用WIndows身份验证对用户进行身份验证。 我创建了示例应用程序,它通过覆盖函数AuthorizeAttribute、ActionFilterAttribute使用自定义身份验证。这是一个好方法吗

  • 哪个属性最适合用于身份验证
  • 我有一个仪表盘。因此,我需要根据角色显示或隐藏控件。 假设有3个网格(表),如果管理员登录,他可以看到3个网格(表)。 但若支持用户登录,他只能看到2个网格(表)

    我的计划是为每个网格创建局部视图,因此每个局部视图都有一个操作和控制器。 将有一个数据库,我将指定每个组可以执行的操作。这样我就可以过滤请求了

    2如何根据角色隐藏或显示局部视图

    我尝试了一些SO链接,但他们都在谈论2,3个角色,而且是硬编码的。 在我的例子中,角色可能会有所不同,我们使用db设置角色的访问权限


    提前谢谢。

    我也做过类似的事情。我做这件事的方式(可能不是最好的)

    是将布尔值发送回视图

    在控制器使用中:

    bool showSection1 = true;
    bool showSection2 = false;
    
    ViewData["showSection1"] = showSection1;
    ViewData["showSection2"] = showSection2;
    /// may be better to use a viewmodel here rather than ViewData
    
    然后在视图中:

    @if((bool)ViewData["showSection1"])
    {
        @{Html.RenderPartial("section1");}
    }
    @if((bool)ViewData["showSection2"))
    {
        @{Html.RenderPartial("Section2");}
    }
    
    您将需要执行逻辑来按您希望的方式设置布尔值,但这应该是一个开始

    您还可以创建一个静态方法,该方法返回角色,然后直接从视图中获取该值。但这可能是一种糟糕的形式

    @if(AppHelper.GetRole().equals("role1")){
        //show the partial
    }
    

    然后创建一个名为AppHelper的类和一个名为GetRole的方法,该方法返回用户的角色。

    您可以使用以下代码进行基于角色的检查

    @if(Request.IsAuthenticated)
    
    {
        if(User.IsInRole("Admin"))
        {
         <Ul Class="SubMenuItem">
    
         <li> this menu item is for Admin role</li>
         </Ul>
        }
         if(User.IsInRole("User"))
        {
         <Ul Class="SubMenuItem">
    
         <li> this menu item is for User role</li>
         </Ul>
        }
    }
    @* For unknown user *@
    else
    {
         <Ul Class="SubMenuItem">
             <li> this menu item is for Unknown user</li>
         </Ul>
    }
    
    @if(Request.IsAuthenticated)
    {
    if(User.IsInRole(“Admin”))
    {
    
    • 此菜单项用于管理员角色
    } if(User.IsInRole(“用户”)) {
    • 此菜单项适用于用户角色
    } } @*对于未知用户*@ 其他的 {
    • 此菜单项适用于未知用户
    }
    通常,您希望在几乎没有逻辑的情况下保持视图尽可能干净。 我建议将角色检查逻辑移动到控制器操作中,并根据用户角色呈现部分视图

    您可以使用和Html.Action扩展方法将其连接起来

    从MSDN:

    子操作方法为部分视图呈现内联HTML标记 而不是渲染整个视图。标记为的任何方法 ChildActionOnlyAttribute只能通过Action或 呈现HTML扩展方法

    在项目中,创建一个名为Dashboard的新控制器,并添加一个名为BuildTable的操作

    在要显示仪表板表的视图中包括以下行

    @Html.Action("BuildTable", "Dashboard")
    

    控制器/动作注释在这里听起来不太合适,您需要在创建视图模型的服务/层中执行此逻辑检查。那么如何执行此操作呢?你能提供更多的细节吗?我是MVC新手。您的要求非常广泛,但您很可能需要执行以下操作:if(user.role==“admin”{//populate all model grids},if(user.role==“guest”){//只填充他们可以看到的网格,将其他网格保留为null}。然后在您的视图中,if(@model.grid!=null){output data}但是,我如何为每个角色设置If条件。假设我有20个角色,我需要检查这是否是角色1其他角色2等?是否有其他解决方案增益-您提出了一些非常广泛的问题,您得到的任何答案都将非常通用。您可以将其拆分为多个函数/视图/等,您可以执行If/then/else,还有m还有其他方法。很抱歉不能提供更多帮助。我在使用User.IsInRole时遇到了一个奇怪的问题,出现了“无法连接到SQL Server数据库”错误。我通过添加[InitializeSimpleMembership]来修复它关于控制器。这里进行更多讨论:-1.这并不能真正回答问题。当您只有少量角色时,这是一个不错的解决方案,但问题明确指出:“我尝试了一些SO链接,但他们都在谈论2,3个角色,并且是硬编码的。在我的情况下,角色可能会有所不同,我们使用db为角色设置访问权限。”
    @Html.Action("BuildTable", "Dashboard")