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

kbv*_*hnu 17 .net asp.net asp.net-mvc authorization windows-authentication

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

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

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

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

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

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

提前致谢.

Yog*_*esh 19

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

@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>
}
Run Code Online (Sandbox Code Playgroud)

  • - 1.这并没有真正回答这个问题.当你只有少量角色时,这是一个很好的解决方案,但问题清楚地表明:"我尝试了一些SO链接,但他们所有人都在谈论2,3个角色而且它是硬编码的.在我看来,角色可能会有所不同我们使用db来设置角色访问权限." (3认同)

mat*_*tt. 12

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

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

来自MSDN:

子操作方法为视图的一部分呈现内联HTML标记,而不是呈现整个视图.只能使用Action或RenderAction HTML扩展方法调用使用ChildActionOnlyAttribute标记的任何方法.

在您的项目中,创建一个名为Dashboard的新Controller,并添加一个名为BuildTable的 Action .

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

        return PartialView("_SupportTable");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@Html.Action("BuildTable", "Dashboard")
Run Code Online (Sandbox Code Playgroud)


twa*_*ron 6

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

是将布尔值发送回视图

在控制器中使用:

bool showSection1 = true;
bool showSection2 = false;

ViewData["showSection1"] = showSection1;
ViewData["showSection2"] = showSection2;
/// may be better to use a viewmodel here rather than ViewData
Run Code Online (Sandbox Code Playgroud)

然后在视图中:

@if((bool)ViewData["showSection1"])
{
    @{Html.RenderPartial("section1");}
}
@if((bool)ViewData["showSection2"))
{
    @{Html.RenderPartial("Section2");}
}
Run Code Online (Sandbox Code Playgroud)

您将需要执行逻辑以按照您希望的方式设置布尔值,但这应该是一个开始。

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

@if(AppHelper.GetRole().equals("role1")){
    //show the partial
}
Run Code Online (Sandbox Code Playgroud)

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