修改不同用户的_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) {  } 

和我想要隐藏的第二个下拉列表几乎相同的代码。 这是有效的,但此时我需要在每种方法中检查角色。 它有大量的冗余代码。 谁能建议我如何让它变得更好?

我看到你的角色是静态的,因为你检查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 。 先抛出它然后检查控制器中的角色。