正如问题所说,我正在尝试在MVC5 View中检查用户对象的角色。基本上我的观点是所有注册用户及其当前角色的列表。
以下是我的观点:
@model IEnumerable<IconicMx.CandidateDatabase.Models.ApplicationUser>
@{
ViewBag.Title = "Talent Center Institute: Usuarios";
ViewBag.Menu = "Usuarios";
ViewBag.Submenu = "Lista de usuarios";
ViewBag.MenuFaClass = "fa-cog";
ViewBag.InitialPanel = true;
}
<h2>Lista de usuarios</h2>
<p>
@Html.ActionLink("Crear usuario", "Register", "Account", null, new { @class = "btn btn-primary" })
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.name)
</th>
<th>
@Html.DisplayNameFor(model => model.Email)
</th>
<th>
Tipo de usuario
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@if (ViewBag.manager.IsInRole(item.Id, "Admin"))
{
<text>Administrador</text>
}
else
{
<text>Capturista</text>
}
</td>
<td>
@Html.ActionLink("Editar", "Edit", new { id=item.Id }, new { @class = "btn btn-primary btn-xs" }) |
@Html.ActionLink("Eliminar", "Delete", new { id=item.Id }, new { @class = "btn btn-primary btn-xs" })
</td>
</tr>
}
</table>
这是我的控制者:
public ActionResult Index()
{
ViewBag.manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());
return View(db.Users.ToList());
}
我正在尝试使用UserManager的IsInRole函数,但在渲染视图时出现运行时错误,说明函数未定义!!如果我在控制器中调用此函数,它将按预期运行。
注意:我不是试图在会话中获取当前登录的用户!! (User.identity.IsInRole没有帮助)
答案 0 :(得分:0)
首先,将数据从控制器中的数据库中取出并将数据传递到视图中,而不是引用服务类。这将为您节省很多麻烦。 ViewBag适用于传递奇怪的可序列化对象,但在传递对具有大量行为的类的引用时效果不佳。
其次,您需要在UserManager上使用IsInRoleAsync
method。是的,有IsInRole
非异步扩展方法可用,但我没有看到您使用了必需的命名空间。
所以我做了一个视图模型类: 公共类UserViewModel { public String Id {get;组; } public String用户名{get;组; } public String Email {get;组; } public bool IsAdmin {get;组; } //其他属性 }
然后调整控制器进行数据提取:
private UserManager<ApplicationUser> userManager;
public MyController()
{
userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());
}
public async Task<ActionResult> Index()
{
var viewModels = db.Users.Select(u => new UserViewModel(){ Id = u.Id, Username = u.Username, Email = u.Email }).ToList();
foreach (var userModel in viewModels)
{
userModel.IsAdmin = await userManager.IsInRoleAsync(userModel.Id, "Admin");
}
return View(viewModels);
}
然后调整视图以获取List<UserViewModel>
并相应地显示数据 - 我将留给您完成。