سلام دوستان
توی جدول کاربران یه فیلد دارم با نام isactive و می خوام توی تمام اکشن ها چک کنم که کاربر اکتیو هست یا نه. این شرط رو دارم توی تمام اکشنها با if چک می کنم. راه حلی هست که اتوماتیک توی تمام اکشن ها سرچ کنه؟ یا حداقل کارو راحت تر کنه
اگر از Repository استفاده کنید کافیه فقط در اونجا قرار بدید و همه Action های استفاده کننده پیروی میکنند
من فعلا یه متد توی یه کلاس نوشتم که با فراخونی اون اگه کاربر اکتیو نباشه بره به صفحه لاگین. کدم اینه:
public static RedirectResult CheckUserRollAndAvtive(string username) { LabkhandModel db = new LabkhandModel(); if (db.Users.FirstOrDefault(u => u.UserName == username).Role.RoleName == "user") { return new RedirectResult("/Users/Events"); } var user = db.Users.FirstOrDefault(u => u.UserName == username); if (!user.IsActive || user.ActiveToDate < DateTime.Now) { return new RedirectResult("/Account/Login"); } else { return null; } }
و اونو توی اکشن فراخونی می کنم:
public ActionResult Index() { Classes.Labkhand.CheckUserRollAndAvtive(User.Identity.Name); var user = db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name); var users = db.Users.Where(u=>u.CompanyId==user.CompanyId).Include(u => u.Company).Include(u => u.Job).Include(u => u.Role); return View(users.ToList()); }
ولی کار نمیکنه. breakpoint میزارم و اکتیو بودن کاربر رو چک میکنه و redirect رو return می کنه (return new RedirectResult("/Account/Login"))
ولی وقتی دوباره به اکشن بر می گرده بجای اینکه redirect کنه بقیه کدها رو اجرا می کنه
var user = db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name); var users = db.Users.Where(u=>u.CompanyId==user.CompanyId).Include(u => u.Company).Include(u => u.Job).Include(u => u.Role); return View(users.ToList());
من متوجه شرط های شما در کد نشدم
باید کد رو Trace کنید و مقادیر بازگشتی رو بررسی کنید تا متوجه بشید کدام خط داره مشکل ایجاد میکنه
متد اول که توی کلاس نوشتم اول بررسی می کنه که گروه کاربری اگر user بود کاربر رو به "/Users/Events" انتقال بده و در شرط بعدی اگر کاربر اکتیو نباشه یا تاریخ اکتیو بودنش گذشته باشه اونو به صفحه لاگین انتقال میده و اگر هیچ کدوم از شرط ها برقرار نبود کاری نکنه. توی کد دوم اومدم از این متد استفاده کردم:
Classes.Labkhand.CheckUserRollAndAvtive(User.Identity.Name);
حالا اگه کاربر مثلا اکتیو نباشه خط فرمان به return
new
RedirectResult(
"/Account/Login"
); میره و از بدنه متد میاد بیرون و دوباره میره توی actionresult و الباقی کارها رو انجام میده!!! مگه نباید redirect کنه؟
اصلا ارور نمیده و فقط بعد
CheckUserRollAndAvtive تا آخرین خط actionresult میره
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)