继续,之前做的是用户注册登录。但是没有管理用户的地方,简单做一个列表,添加和删除功能。
右键点击Controllers目录,选择添加控制器
选择EF的MVC控制器
选择模型类型是ApplicationUser,选择数据上下文类是ApplicationDbContext类,控制器名称会自动生成,然后确定。
开始重写新增用户的内容
添加新的模型
在Models目录下新增ApplicationUserViewModels目录
添加CreateViewModel类
其中,Roles是用来返回当前选中哪些权限
using Microsoft.AspNetCore.Mvc.Rendering;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace RCKohi.Models.ApplicationUsersViewModels
{
public class CreateViewModel
{
[Required]
[DataType(DataType.Text)]
[Display(Name = "用户名")]
public string UserName { get; set; }
[EmailAddress]
[Display(Name = "电子邮箱")]
public string Email { get; set; }
[Phone]
[Display(Name = "电话")]
public string PhoneNumber { get; set; }
[Required]
[StringLength(100, ErrorMessage = "{0} 必须多于 {2} 位并且少于 {1} 位。", MinimumLength = 6)]
[DataType(DataType.Text)]
[Display(Name = "密码")]
public string Password { get; set; }
[Display(Name = "权限")]
public IList<string> Roles { get; set; }
}
}
修改视图,将控制器传过来的RolesList变成多选框
@model RCKohi.Models.ApplicationUsersViewModels.CreateViewModel
@{
ViewData["Title"] = "用户管理";
Layout = "~/Views/Shared/_LayoutSbAdmin2.cshtml";
}
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">新增用户</div>
<div class="panel-body">
<form role="form" asp-action="Create">
<div class="form-group">
<label asp-for="UserName" class="control-label"></label>
<input asp-for="UserName" class="form-control" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="PhoneNumber" class="control-label"></label>
<input asp-for="PhoneNumber" class="form-control" />
<span asp-validation-for="PhoneNumber" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Password" class="control-label"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group">
<label>用户权限</label>
<div class="checkbox">
@foreach (var item in (SelectList)ViewBag.RolesList)
{
<label class="checkbox-inline">
<input type="checkbox" name="selectedRoles" value="@item.Value" />
@item.Text
</label>
}
</div>
</div>
<div class="form-group">
<div asp-validation-summary="All" class="text-danger"></div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary" data-toggle="tooltip" data-placement="bottom" title="新增"><i class="fas fa-plus-circle"></i> 新增用户</button>
<a asp-action="Index" class="btn btn-success" data-toggle="tooltip" data-placement="bottom" title="列表"><i class="far fa-list-alt"></i> 返回列表</a>
</div>
</form>
</div>
</div>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
修改ApplicationUsersController控制器
首先在定义处增加注入
private readonly ApplicationDbContext _context;
private readonly UserManager<ApplicationUser> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public ApplicationUsersController(
ApplicationDbContext context,
UserManager<ApplicationUser> userManager,
RoleManager<IdentityRole> roleManager
)
{
_context = context;
_userManager = userManager;
_roleManager = roleManager;
}
修改控制器的Create方法
在获取页面的时候,用ViewBag.RolesList把所有权限返回给页面
// GET: ApplicationUsers/Create
public async Task<IActionResult> Create()
{
ViewBag.RolesList = new SelectList(await _roleManager.Roles.ToListAsync(), "Name", "NormalizedName");
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(CreateViewModel model, string returnUrl = null, params string[] selectedRoles)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
if (model.Email == null)
{
model.Email = "5140075@qq.com";
}
var user = new ApplicationUser { UserName = model.UserName, Email = model.Email, PhoneNumber = model.PhoneNumber };
var userResult = await _userManager.CreateAsync(user, model.Password);
if (userResult.Succeeded)
{
if (selectedRoles != null)
{
var roleResult = await _userManager.AddToRolesAsync(user, selectedRoles);
if (roleResult.Succeeded)
{
return RedirectToAction(nameof(Index));
}
foreach (var error in roleResult.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
//return RedirectToAction(nameof(Index));
}
foreach (var error in userResult.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
这个时候就可以正确添加用户了。
再添加一个ViewModel用于显示详细信息和编辑用户用
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace RCKohi.Models.ApplicationUsersViewModels
{
public class UserViewModel
{
[Display(Name = "用户ID")]
public string Id { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "用户名")]
public string UserName { get; set; }
[EmailAddress]
[Display(Name = "电子邮箱")]
public string Email { get; set; }
[Phone]
[Display(Name = "电话")]
public string PhoneNumber { get; set; }
[Display(Name = "权限")]
public IList<string> Roles { get; set; }
}
}
之后依次修改显示信息,删除和编辑的视图,并修改控制器。
修改用户的时候,先把当前用户所有权限清除,如果当前选择权限不为空则添加权限。
删除用户的时候,先删除权限,再删除用户。
最后,为控制器添加权限控制注解
namespace RCKohi.Controllers
{
[Authorize]
public class ApplicationUsersController : Controller
{
把不用的方法注释掉,这样,一个简单的用户登录,并且带后台管理用户的小战点就OK了