在我的应用程序中,我有带菜单的导航栏。在菜单中我有3个下拉菜单。
访问受到限制,但菜单对所有人都可见。我想为普通和公共(任意)用户隐藏不必要的元素。
用于识别我正在使用Windows登录名
要获取用户角色,我要求数据库和查询返回用户是普通用户还是管理员。
我的解决方案:
public bool CheckIfAdmin(string login)
{
bool admin = false;
EquipmentEntities db = new EquipmentEntities();
Tuple<string, string> 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)
{
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Admin<b class="caret"></b></a>
<ul class="dropdown-menu">
//MEnu
</ul>
</li>
}
和我想要隐藏的第二个下拉列表几乎相同的代码。 这是有效的,但此时我需要在每种方法中检查角色。它有大量的冗余代码。谁能建议我如何让它变得更好?
答案 0 :(得分:1)
我发现您的角色是静态的,因为您检查if(RoleId==1)
以便该用户是管理员。我认为您可以定义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
。首先进行转换,然后在控制器中检查角色。