【问题标题】:User & roles into a table asp.net mvc用户和角色到表 asp.net mvc
【发布时间】:2016-05-03 17:26:46
【问题描述】:

我得到了这个东西,但是我想采用不同的方法,因为当用户只有一个角色时,表格缺少行。我在网站上有 3 个角色:用户、超级用户和管理员。

这是我的控制器:

 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 的表格中,我希望用户超级用户和管理员为每个用户提供一个模型,但我无法真正让它工作,我该如何以最好的方式实现这一点?

【问题讨论】:

  • 不清楚你想要的输出是什么。当用户仅包含 1 个或 2 个角色时,您需要额外的空单元格吗?
  • @StephenMuecke 是的,我希望能够决定每个角色将进入哪个单元,所以我猜我需要更多模型等
  • 这是当前代码imgur.com/URMGV16的样子@
  • 您需要修改控制器方法以使用 3 个值(如果角色不存在则为空字符串)填充您的 Roles 属性,并且它们需要按顺序排列。
  • @StephenMuecke 是的,我想我必须做这样的事情,只是想弄清楚如何......我在 asp 和 c# 方面还差得很远,哈哈,我正在努力学习

标签: c# asp.net asp.net-mvc user-controls roles


【解决方案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 来清理......

【讨论】:

  • 谢谢你仔细研究一下,经过重新考虑,我想我现在正在以一种好的方式解决这个问题
  • 顺便说一句,我尝试了与最后一个控制器类似的代码,但我收到错误“已经有一个打开的数据读取器与此命令关联,必须先关闭”@S.Brentson
  • 您实际上应该在每个循环中抓取一次用户的角色。无需查看用户管理器的底层内容,这应该可以避免问题。
  • oookey,不是 100% 你的意思。但是我不能使用我的控制器,并且以某种方式为每个 td 中的每个角色使用“@User.IsInRole("User").ToString()",这样我应该得到真或假......但我明白我不能简单地这样做,但有没有简单的方法可以做到这一点?
  • 控制器的@User 属性仅指当前登录到Web 应用程序的用户。这不会很有帮助,也不适合在这里。我修改了我的答案以重构角色查找。请参阅“var 角色 = ...”。我没有重构整个解决方案,所以我无法测试我的代码和标记,但它应该生成一个用户矩阵,其中三个角色中的每一个都带有复选框。
猜你喜欢
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多