我得到了这个东西,但是我想采取不同的方法,因为当用户只有一个角色时,表缺少行。我在网站上有3个角色:User,SuperUser和Admin。
这是我的控制者:
public ActionResult UserList()
{
var userRoles = new List<RolesViewModel>();
var context = new ApplicationDbContext();
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
foreach (var user in userStore.Users)
{
var r = new RolesViewModel
{
UserName = user.UserName
};
userRoles.Add(r);
}
foreach (var user in userRoles)
{
user.RoleNames = userManager.GetRoles(userStore.Users.First(s => s.UserName == user.UserName).Id);
}
return View(userRoles);
}
这是我的RolesViewModel:
public class RolesViewModel
{
public IEnumerable<string> RoleNames { get; set; }
public string UserName { get; set; }
}
观点:
<table class="table table-hover">
<tr>
<th>
@Html.DisplayNameFor(model => model.UserName)
</th>
<th>
Role 1
</th>
<th>
Role 2
</th>
<th>
Role 3
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
@foreach (var role in item.RoleNames)
{
<td>
@Html.DisplayFor(modelItem => role)
</td>
}
</tr>
}
</table>
因此,在我获得角色1角色2和角色3的表中,我想让用户超级用户和管理员为每个人提供一个模型,但我真的无法使用它,我如何以最佳方式实现这一目标?
答案 0 :(得分:1)
我知道您期待三个特定角色,但您的模型未来可能会包含更多内容。在这方面,您的发言并不是非常具有前瞻性。此外,这种结构有太多方法可以分解以简洁地回答。相反,我建议您重新构建网格和视图模型以适应。
稍微更改您的视图模型:
public class RolesViewModel
{
public string RoleNames { get; set; }
public string UserName { get; set; }
}
接下来,结合使您的数据访问更加高效以及修改Roles属性值的方式:
public ActionResult UserList() {
var userRoles = new List<RolesViewModel>();
var context = new ApplicationDbContext();
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
foreach (var user in userStore.Users)
{
var r = new RolesViewModel()
{
UserName = user.UserName,
RoleNames = string.Join(",", userManager.GetRoles(user.Id))
};
userRoles.Add(r);
}
return View(userRoles);
}
然后最后简化你的网格:
<table class="table table-hover">
<tr>
<th>
User Name
</th>
<th>
Roles
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(m => item.UserName)
</td>
<td>
@Html.DisplayFor(m => item.RoleNames)
</td>
</tr>
}
</table>
最后,如果您必须坚持使用此结构,那么至少使用复选框样式的设置是相同的演示文稿:
public class RolesViewModel
{
public string UserName { get; set; }
public bool UserRole { get; set; }
public bool SuperUserRole { get; set; }
public bool AdminRole { get; set; }
}
public ActionResult UserList()
{
var userRoles = new List<RolesViewModel>();
var context = new ApplicationDbContext();
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
foreach (var user in userStore.Users)
{
var roles = userManager.GetRoles(user.Id);
var r = new RolesViewModel()
{
UserName = user.UserName,
UserRole = roles.Contains("User"),
SuperUserRole = roles.Contains("SuperUser"),
AdminRole = roles.Contains("Admin")
};
userRoles.Add(r);
}
return View(userRoles);
}
}
}
<table class="table table-hover">
<tr>
<th>
User Name
</th>
<th>
User
</th>
<th>
Super User
</th>
<th>
Admin
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(m => item.UserName)
</td>
<td>
@Html.CheckBoxFor(m => item.UserRole)
</td>
<td>
@Html.CheckBoxFor(m => item.SuperUserRole)
</td>
<td>
@Html.CheckBoxFor(m => item.AdminRole)
</td>
</tr>
}
</table>
为了记录,我意识到这个控制器在如何通过为每个唯一用户进行数据存储的一系列往返来抓取每个用户角色有点难看。如果使用它,我会把它留给OP清理......