2015-11-11 3 views
0

У меня есть 16 разных ролей, и я пытаюсь отфильтровать список в соответствии с ролью пользователя. Я надеялся, что есть способ отфильтровать это с помощью LINQ, но я не уверен в лучшем подходе к этому.фильтрация списка записей User.IsInRole MVC

[HttpPost] 
    public ActionResult Login(int? Group, int? ListDept, int DivisionID) 
    { 

     LoginViewModel login = new LoginViewModel(); 

     login.GroupID = Group; 
     login.ListDeptID = ListDept; 
     login.DivisionID = DivisionID; 

     bool rolecheck1 = false; 
     bool rolecheck2 = false; 
     bool rolecheck3 = false; 

     rolecheck1 = User.IsInRole("Role1"); 
     rolecheck2 = User.IsInRole("Role2"); 
     rolecheck3 = User.IsInRole("Role3"); 

     if (rolecheck1 == true && login.GroupID == 1) 
     { 
      login.GroupID = 1; 
     } 
     if (rolecheck2 == true && login.GroupID == 2) 
     { 
      login.GroupID = 2; 
     } 
     if (rolecheck3 == true && login.GroupID == 3) 
     { 
      login.GroupID = 3; 
     } 
     Session["Login"] = login; 
     return RedirectToAction("Index", "Case"); 
    } 

После Почтой он идет на индексную страницу, где я пытаюсь фильтровать эти списки, и я думаю, что я собираюсь об этом совершенно неправильно: /. Вот страница Index, где я загружаю список записей. Я также фильтрую случай, назначенный человеку, и он отлично работает. Но как я могу фильтровать эти разрешения, чтобы показать также запись, для которой у человека есть разрешение?

public ActionResult Index() 
    { 
     LoginViewModel login = new LoginViewModel(); 
     login = (LoginViewModel)Session["Login"]; 

     // uses the DirectorySearcher to find a users email address to use the "assignedTo" for filtering 
     var assignedto = User.Identity.Name.Split('\\')[1]; 
     string emailAddr = null; 
     try 
     { 
      DirectorySearcher searcher = new DirectorySearcher(); 
      searcher.Filter = string.Format("sAMAccountName={0}", assignedto); 
      SearchResult user = searcher.FindOne(); 
      emailAddr = user.Properties["mail"][0].ToString(); 
     } 
     catch 
     { 
      TempData["loginErrorMessage"] = String.Format("Directory Services is down or you have an invalid account"); 
      return RedirectToAction("Login"); 
     } 

     CaseListViewModel cases = new CaseListViewModel(); 
     cases.OpenCases = db.Cases.Where(c => c.StatusID == 1 && c.AssignedTo == emailAddr || login.DivisionID == c.DivisionID && login.GroupID == c.GroupID); 
     cases.ClosedCases = db.Cases.Where(c => c.StatusID == 2); 


     // Before added email filtering for assigned to 
     //cases.OpenCases = db.Cases.Where(c => c.StatusID == 1); 

     // Loop that checks each case and compares DateTime.Now to Lockout Stamp to unlock cases 

     foreach (var cased in cases.OpenCases) 
     { 
      DateTime LockoutDate = new DateTime(); 

      if (cased.Lockout_TS.HasValue) 
      { 
       LockoutDate = (DateTime)cased.Lockout_TS; 
      } 

      if (cased.LockCase == true) 
      { 
       bool shouldUnlock = (DateTime.Now - LockoutDate).TotalMinutes > 15; 

       //if yes, then unlock it 
       if (shouldUnlock) 
       { 
        cased.LockCase = false; 
        cased.Lockout_TS = null; 
       } 


      } 
     } 
     // End Loop 
     db.SaveChanges(); 
     return View(cases); 
    } 

Любая помощь будет очень признательна.
Спасибо Adam

ответ

0

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

var roleGroupMap = new Dictionary<string, int> { 
    ["Role1"] = 1, 
    ["Role2"] = 2, 
    ["Role3"] = 3 
    }; 

... 

    var userRole = roleGroupMap.Keys.FirstOrDefault(x => User.IsInRole(x)); 
    if (userRole != null) { 
    login.GroupID = roleGroupMap[userRole]; 
    } 

Эта модель предназначена для размещения пользователя, имеющего одну роль. Если пользователи могут иметь более одной роли, тогда необходимо будет изменить код LoginViewModel, чтобы записать коллекцию групп и связанных групп.

С коллекцией GroupIDs:

roleGroupMap.Keys 
    .Where(x => User.IsInRole(x)) 
    .ToList() 
    .ForEach(x => login.GroupIDs.Add(x => User.IsInRole(x))) 
+0

Это идеальный вариант !!! Я понимаю, что вы делаете. Но ему не нравится «[» Role1 »] = 1, [" Role2 "] = 2, [" Role3 "] = 3" эта часть и дает мне синтаксическую ошибку, поэтому я изменил ее на " {"Role1, 1}, {" Role2 "} и т. Д. Могу ли я установить значение Role1 равным 1, поэтому я могу сравнить его с GroupID? Еще раз спасибо. – brachen33

+0

Синтаксис для инициализации словаря является новым в C# 6. То, что у вас есть, подходит для настройки словаря с использованием C# 5. – HashPsi

+0

Поскольку я могу сравнивать только одно значение, и мне нужно несколько разрешений, я создал коллекцию в моей LoginViewModel. Для выполнения этой работы мне нужно создать цикл для проверки множественных разрешений? Еще раз спасибо. – brachen33

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