修改不同用户的_layout

时间:2014-02-19 13:13:39

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

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

  • 公共
  • 适用于普通用户
  • for admins

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

用于识别我正在使用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>
         }

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

1 个答案:

答案 0 :(得分: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。首先进行转换,然后在控制器中检查角色。