如何在View MVC5

时间:2018-02-07 00:11:18

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-identity

正如问题所说,我正在尝试在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没有帮助)

1 个答案:

答案 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>并相应地显示数据 - 我将留给您完成。