2014-02-19 5 views
0

В моем приложении у меня есть панель навигации с меню. В меню у меня есть 3 выпадающих меню.Изменить _layout для разных пользователей

  • общественного
  • для обычных пользователей
  • админов

Доступ ограничен, но меню открыты для всех. Я хочу скрыть ненужный элемент для обычных и общедоступных (anynymous) пользователей.

для identyfication Я использую окно Войти имена

Чтобы получить роль пользователя, я с просьбой к базе данных и запросы возвращается, если пользователь является обычным пользователем или администратора.

Мое решение:

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 ода для второго выпадающего я хочу спрятаться. Это работает, но в этот момент мне нужно поставить проверки на роль в каждом методе. Его большое количество избыточного кода. Может ли кто-нибудь предложить мне, как сделать это лучше?

ответ

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. Сначала запустите его, затем проверьте роль, как в контроллере.

Смежные вопросы