我有很多检查来确定用户的角色 然后分配一个角色编号。有什么办法吗? 我可以简化检查吗?
if (User.IsInRole("Super"))
{
ViewBag.Role = 30;
}
else if (User.IsInRole("Admin"))
{
ViewBag.Role = 20;
}
...
...
else if (User.IsInRole("Guest"))
{
ViewBag.Role = 10;
}
else
{
ViewBag.Role = 5;
}
我需要做的是找到用户所处的最高角色,然后将该值分配给ViewBag.Role,这是一个动态变量。上面的代码确实有效,但所有if和else语句对我来说都不是很好的编码实践。
答案 0 :(得分:3)
您可以向User类添加属性:
public virtual int RoleNumber
{
get
{
if (this.IsInRole("Super")) return 30;
if (this.IsInRole("Admin")) return 20;
if (this.IsInRole("Guest")) return 10;
return 5;
}
}
然后在视图中:
ViewBag.Role = User.RoleNumber
答案 1 :(得分:2)
如果用户只有一个角色,您可以使用GetRoles方法返回一组角色,以检查它是否具有任何值。
如果确实如此 - 您可以解析用户拥有的第一个和唯一一个角色作为枚举,其中包含您要提供视图包的值。如果数组没有值 - 您可以提供默认的最小值。
如果有多个角色,它可以以更“复杂的方式”解决,但是在一天结束时,开发,理解和执行的成本可能比简单的if..else代码
答案 2 :(得分:2)
我会使用枚举而不是字符串。这允许您对名称进行编译时检查。
以下代码为您提供了更改(广告或删除)角色的灵活性,而无需更改下划线角色检查逻辑。
public int IsInRole()
{
int defaultValue = (int)UserRole.Default;
var names = Enum.GetNames(typeof (UserRole));
foreach (var name in names)
{
if(User.IsInRole(name))
{
defaultValue = (int)((UserRole)Enum.Parse(typeof(UserRole), name));
break;
}
}
return defaultValue;
}
public enum UserRole
{
Super = 30,
Admin = 20,
Guest = 10,
Default = 5
}
答案 3 :(得分:1)
您可以尝试这样的事情:
Dictionary<string, int> weight = new Dictionary<string, int>();
weight.Add("Super", 30);
weight.Add("Admin", 20);
weight.Add("Guest", 10);
string[] roles = Roles.GetRolesForUser(User.Identity.Name);
if (roles.Any())
{
ViewBag.Role = weight.Where(w => roles.Contains(w.Key))
.OrderBy(w => w.Value)
.FirstOrDefault();
}
else
{
ViewBag.Role = 5;
}
答案 4 :(得分:1)
假设您的Role类为
public class Role
{
public string Name { get; set; }
public int Number { get; set; }
......
}
您可以使用
var roles = GetYourRoles(); // IEnumerable<Role>
var result = roles.First(r => User.IsInRole(r.Name));
答案 5 :(得分:0)
如何扩展ASP.NET的角色表?如果每个角色都有固定的权重,那么创建一个表(称为RoleWeight
或其他东西)并使用该角色设置所需的权重。这样,你就不必设置任何东西(并且消除那些看起来不像编码习惯良好的代码&#34;),而是已经存在价值。