修改不同用户的_layout
在我的应用程序中,我有带菜单的导航栏。 在菜单中我有3个下拉菜单。
- 上市
- 对于普通用户
- 对于管理员
访问受到限制,但菜单对所有人都可见。 我想隐藏普通和公共(anynymous)用户不必要的元素。
为了识别我正在使用Windows登录名
要获取用户角色,我要求数据库和查询返回用户是普通用户还是管理员。
我的解决方案
public bool CheckIfAdmin(string login) { bool admin = false; EquipmentEntities db = new EquipmentEntities(); Tuple 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) { Admin }
和我想要隐藏的第二个下拉列表几乎相同的代码。 这是有效的,但此时我需要在每种方法中检查角色。 它有大量的冗余代码。 谁能建议我如何让它变得更好?
我看到你的角色是静态的,因为你检查if(RoleId==1)
以便用户是admin。 我认为你可以定义像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
。 先抛出它然后检查控制器中的角色。