【问题标题】:How to Show or hide controls based on roles - ASP.NET MVC 4 Razor如何根据角色显示或隐藏控件 - ASP.NET MVC 4 Razor
【发布时间】:2012-08-06 14:08:22
【问题描述】:

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

  1. 哪个属性最适合用于身份验证?

我有一个仪表板。所以我需要根据角色显示或隐藏控件。 假设如果有 3 个网格(表),如果管理员登录,他可以看到 3 个网格(表)。 但如果支持用户登录,他只能看到 2 个网格(表格)。

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

2 如何根据角色隐藏或显示部分视图?。

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

提前致谢。

【问题讨论】:

  • 控制器/动作注释在这里听起来不太合适,您需要在创建视图模型的服务/层中执行此逻辑检查。
  • 那么怎么做呢?你能提供更多细节吗?我是 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,有很多方法可以走。很抱歉不能提供更多帮助

标签: asp.net .net asp.net-mvc authorization windows-authentication


【解决方案1】:

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

@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>
}

【讨论】:

  • 我在使用 User.IsInRole 时遇到了一个奇怪的问题,出现“无法连接到 SQL Server 数据库”错误。我通过在控制器上添加 [InitializeSimpleMembership] 来修复它。更多讨论:stackoverflow.com/questions/14521003/…
  • - 1. 这并不能真正回答问题。当您只有少数角色时,这是一个不错的解决方案,但问题清楚地表明:“我尝试了一些 SO 链接,但他们都在谈论 2,3 角色并且它是硬编码的。在我的情况下,角色可能会有所不同我们使用 db 来设置角色的访问权限。”
【解决方案2】:

通常,您会希望尽可能保持视图简洁,几乎没有逻辑。 我建议将您的角色检查逻辑移动到控制器操作中,并根据用户角色呈现部分视图。

您可以使用ChildActions 和 Html.Action 扩展方法来连接。

来自 MSDN:

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

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

public class DashboardController : Controller
{
    [ChildActionOnly]
    public ActionResult BuildTable()
    {
        if (Roles.IsUserInRole("Administrator"))
        {
            return PartialView("_AdminTable");
        }

        return PartialView("_SupportTable");
    }
}

在您希望仪表板表出现的视图中包含以下行。

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

【讨论】:

    【解决方案3】:

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

    是将布尔值发送回视图

    在控制器中使用:

    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 的方法,该方法返回用户的角色。

    【讨论】:

      猜你喜欢
      • 2014-12-31
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      相关资源
      最近更新 更多