【问题标题】:Modify _layout for different users为不同用户修改_layout
【发布时间】:2014-02-19 13:13:38
【问题描述】:

在我的应用程序中,我有带菜单的导航栏。在菜单中,我有 3 个下拉菜单。

  • 公开
  • 普通用户
  • 对于管理员

访问受到限制,但菜单对所有人可见。我想为普通用户和公共(任何)用户隐藏不必要的元素。

我使用 Windows 登录名进行身份验证

为了获得一个用户角色,如果用户是普通用户或管理员,我询问数据库和查询返回。

我的解决方案:

public bool CheckIfAdmin(string login)
    {
        bool admin = false;
        EquipmentEntities db = new EquipmentEntities();
        Tuple<string, string> credentials = GetName(login);
        int RoleId = db.Users.Where(w => w.Name == credentials.Item1).Where(w => w.Surname == credentials.Item2).Select(s => s.RoleId).FirstOrDefault();
        if(RoleId==1)
        {
            admin = true;
        }
        return admin;
    }

用于检查用户是否为几乎相同的代码

在方法中:

if(CheckIfAdmin(login)){
ViewBag.Role=1;
}
else if(CheckIfUser(login)){
    ViewBag.Role=2;
}

最后在布局中:

 @if (ViewBag.Role==1)
        {
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Admin<b class="caret"></b></a>
            <ul class="dropdown-menu">
                //MEnu
            </ul>
          </li>
         }

我想隐藏的第二个下拉列表的代码几乎相同。 这是可行的,但此时我需要检查每种方法中的角色。其大量的冗余代码。谁能建议我如何让它变得更好?

【问题讨论】:

    标签: c# asp.net-mvc twitter-bootstrap


    【解决方案1】:

    我看到你的角色是静态的,因为你检查了if(RoleId==1),所以用户是管理员。我认为你可以定义像enum 这样的角色。

    public enum UserRole
            {
                User = 1,
                Manager = 2,
                Admin = 3,
                //SuperAdmin...etc.
            }
    

    创建基本控制器,添加 CurrentUser 属性。并在执行操作时获取当前用户。

     public class BaseController : Controller
       {
          protected override void OnActionExecuting(ActionExecutingContext filterContext)
          {
             CurrentUser = db.GetLoggedUserFromDatabase();  // to use in controller
             ViewBag.CurrentUser = CurrentUser;             // to use in views
          }
    
          public User CurrentUser { get; set; }   
       }
    

    你的控制器终于实现了BaseController

     public class AnyController : BaseController 
    {
           //in every action you have current user's details.
           //Already you know current users role. you can use it. for example:
           public ActionResult AnyAction()
           {
             if(CurrentUser != null)   //if user logged
             {
               if (CurrentUser.Role == (int)UserRole.Admin) 
               {
                  //user is admin
               }   
             }      
           }
    }
    

    在视图中您可以使用ViewBag.CurrentUser。先施放它,然后像在控制器中一样检查角色。

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 1970-01-01
      • 2023-03-22
      • 2013-02-07
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2019-08-22
      相关资源
      最近更新 更多