ASP.NET MVC视图按角色拆分用户至不同表格的报错与实现求助
解决方法:按角色筛选用户到不同表格
首先得说清楚你代码里的问题:你写的Model.Where(User.IsInRole("Admin"))完全用错了——User.IsInRole("Admin")是用来判断当前登录的你自己是不是管理员,返回的是一个单一的布尔值;但Where()方法需要的是一个能逐个检查每个用户是否符合条件的逻辑(也就是Func<IdentityUser, bool>委托),所以编译器才会报错说不能把bool转成Func。
下面给你两种靠谱的实现方式,优先推荐第一种(符合MVC分层原则):
方法1:在控制器里提前处理数据(推荐)
把筛选逻辑放到控制器里,然后用ViewModel把分好组的用户传给视图,这样视图只负责渲染,逻辑更清晰。
第一步:创建ViewModel
先定义一个专门的视图模型,用来装分好组的用户:
public class UserRoleGroupsViewModel { // 管理员用户列表 public IEnumerable<IdentityUser> AdminUsers { get; set; } // 会员用户列表 public IEnumerable<IdentityUser> MemberUsers { get; set; } }
第二步:在控制器Action里处理数据
在你的控制器方法中,获取所有用户,然后用UserManager筛选出对应角色的用户:
public ActionResult UserTables() { // 初始化UserManager(根据你的项目上下文调整,用依赖注入会更规范) var userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(new ApplicationDbContext())); // 获取所有用户 var allUsers = db.Users.ToList(); // 填充ViewModel var viewModel = new UserRoleGroupsViewModel { AdminUsers = allUsers.Where(user => userManager.IsInRole(user.Id, "Admin")), MemberUsers = allUsers.Where(user => userManager.IsInRole(user.Id, "Member")) }; return View(viewModel); }
第三步:在视图里渲染两个表格
把视图的模型改成刚才的ViewModel,然后分别遍历两个列表:
@model YourProjectNamespace.UserRoleGroupsViewModel <!-- 管理员表格 --> <h3>管理员用户</h3> <table border="1"> <thead> <tr> <th>用户名</th> <th>邮箱是否已确认</th> </tr> </thead> <tbody> @foreach (var admin in Model.AdminUsers) { <tr> <td class="c">@admin.UserName</td> <td class="c">@admin.EmailConfirmed</td> </tr> } </tbody> </table> <br> <!-- 会员表格 --> <h3>会员用户</h3> <table border="1"> <thead> <tr> <th>用户名</th> <th>邮箱是否已确认</th> </tr> </thead> <tbody> @foreach (var member in Model.MemberUsers) { <tr> <td class="c">@member.UserName</td> <td class="c">@member.EmailConfirmed</td> </tr> } </tbody> </table>
方法2:直接在视图里处理(不推荐,因为视图应尽量避免业务逻辑)
如果不想改控制器,也可以在视图里注入UserManager,然后逐个检查每个用户的角色:
@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityUser> @inject UserManager<IdentityUser> UserManager <!-- 管理员表格 --> <table border="1"> <tbody> @foreach (var user in Model.Where(u => UserManager.IsInRole(u.Id, "Admin"))) { <tr> <td class="c">@user.UserName</td> <td class="c">@user.EmailConfirmed</td> </tr> } </tbody> </table> <br> <!-- 会员表格 --> <table border="1"> <tbody> @foreach (var user in Model.Where(u => UserManager.IsInRole(u.Id, "Member"))) { <tr> <td class="c">@user.UserName</td> <td class="c">@user.EmailConfirmed</td> </tr> } </tbody> </table>
核心要点就是:你要判断的是每个用户是否属于目标角色,而不是判断当前登录用户的角色状态。之前的错误就是把当前用户的角色判断结果当成了筛选所有用户的条件,完全搞反了逻辑~
内容的提问来源于stack exchange,提问作者Waled.Nur74
相关产品推荐
相关产品推荐

