У меня есть 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
Это идеальный вариант !!! Я понимаю, что вы делаете. Но ему не нравится «[» Role1 »] = 1, [" Role2 "] = 2, [" Role3 "] = 3" эта часть и дает мне синтаксическую ошибку, поэтому я изменил ее на " {"Role1, 1}, {" Role2 "} и т. Д. Могу ли я установить значение Role1 равным 1, поэтому я могу сравнить его с GroupID? Еще раз спасибо. – brachen33
Синтаксис для инициализации словаря является новым в C# 6. То, что у вас есть, подходит для настройки словаря с использованием C# 5. – HashPsi
Поскольку я могу сравнивать только одно значение, и мне нужно несколько разрешений, я создал коллекцию в моей LoginViewModel. Для выполнения этой работы мне нужно создать цикл для проверки множественных разрешений? Еще раз спасибо. – brachen33