2018教程之mvc+ef之五:Identity角色管理之为用户列表中显示当前用户所属的角色名称
最先已实现了用户列表的显示,关联了部门名称的显示。
现在我如何再上面显示他所属的角色名称哩?
一、重新建个ViewUserList2的显示模型,建在viewmodelS下
增加角色名的字段好做join
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace MYtest2018.ViewModels
{
public class ViewUserList
{
public string Id { get; set; }
[Required]
[Display(Name = "真实姓名")]
public string RealName { get; set; }
[Display(Name = "登录名")]
public string UserName { get; set; }
[Display(Name = "电话")]
[Required]
public virtual string PhoneNumber { get; set; }
[Display(Name = "部门名称")]
[Required]
public string DepartmentName { get; set; }
public string RoleNmae { get; set; }
[Display(Name = "头像")]
public string HeaderPic { get; set; }
public string DepartmentId { get; set; }
public string QQ { get; set; }
public string WX { get; set; }
public string Address { get; set; }
public int Gender { get; set; }
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BirthDate { get; set; }
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}", ApplyFormatInEditMode = true)]
public DateTime CreateTime { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
}
}
二,修改后台LIST方法
[AllowAnonymous]
[HttpGet]
public ActionResult ListUsers(string SeachColumnString, string SearchString, int? page)
{
///读出所有的部门
ViewBag.drolistmenu = db.Departments.OrderBy(x => x.Sort);
///当搜索和部门变量都 不 为空的时间,给page弄一个1值
if (!string.IsNullOrEmpty(SeachColumnString) || !string.IsNullOrEmpty(SearchString)) //当二个变量都不为空时,page=1
{
page = 1;
}
///分而要求的二个变量送前台
ViewBag.SeachColumnString = SeachColumnString; //将二个搜索变量存为viewbag送到前台
ViewBag.SearchString = SearchString;
///将所有用户角色表读出来
var rolses = RoleManager.Roles.ToList();
///将用户列表读出来,不过按部门ID排序
var users1 = (UserManager.Users.OrderBy(m => m.DepartmentId)).ToList();
////将部门表和用户列表组成一张表,主要将部门名称替换部门ID
var users = from m in users1
join mr in db.Departments.ToList() on m.DepartmentId equals mr.Id
select new ViewUserList2
{
Id = m.Id,
UserName = m.UserName,
RealName = m.RealName,
DepartmentName = mr.DepartmentName,
PhoneNumber = m.PhoneNumber,
HeaderPic = m.HeaderPic,
DepartmentId = m.DepartmentId,
QQ = m.QQ,
WX = m.WX,
Address = m.Address,
Gender = m.Gender ?? 0,
BirthDate = m.BirthDate ?? DateTime.Now,
CreateTime = m.CreateTime ?? DateTime.Now,
Email = m.Email,
RoleNmae = string.Join(",", rolses.Where(p => m.Roles.Select(n => n.RoleId).Contains(p.Id)).Select(n => n.Name).ToArray())
};
///关联
///
//var xxx= from m in
///当有索搜真实名称的时候
if (!string.IsNullOrEmpty(SearchString))
{
users = users.Where(x => x.RealName.Contains(SearchString));
}
///当部门索引选择有的时候
if (!string.IsNullOrEmpty(SeachColumnString))
{
users = users.Where(x => x.DepartmentId == SeachColumnString);
}
int pageNumber = page ?? 1; //定义第几页
int pageSize = 6; //每页显几条
//通过ToPagedList扩展方法进行分页
return View(users.ToPagedList(pageNumber, pageSize)); //用topagelist显示
}
将这个用户的角色列表写在rolename
RoleNmae = string.Join(",", rolses.Where(p => m.Roles.Select(n => n.RoleId).Contains(p.Id)).Select(n => n.Name).ToArray())
首先,m就是用户列表中的一个用户,m.roles就这这个用户的所有角色,
m.Roles.Select(n => n.RoleId).
就是这个用户的角色的Id列表,roles.where,就是查询 用户角色列表里有的Id,查出来又是一个列表 Select(n=>n.Name) 就是取 角色名称列表, String.join 就是把这个列表用逗号隔开拼成字符串
m.Roles 就已经用到了userrole,你看到Roles 只有UserId和RoleId属性
三、前台
<div> <strong class="text-navy"> @Html.DisplayFor(m => user.RoleNmae) </strong> </div>
四,效果

浙公网安备 33010602011771号