public class AppUser : IdentityUser{public int Age{get; set;}public Country Country{get;set;}[Required]public string Salary{get; set;} = null!;}
public enum Country{USA,UK,France,Germany,Russia}

Add-Migration Migration-New Update-Database

public class User{[Required][DisplayName("用户名")]public string Name { get; set; } = null!;[Required][DisplayName("邮箱")][RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "电子邮件格式不正确")]public string Email { get; set; } = null!;[Required][DataType(DataType.Password)][DisplayName("密码")]public string Password { get; set; } = null!;[DisplayName("年龄")]public int Age{get; set;}[DisplayName("国家")]public Country Country{get;set;}[DisplayName("薪水")][Required]public string Salary{get; set;} = null!;}
public class UpdateUserDTO{[Required][DisplayName("编号")]public string Id { get; set; } = null!;[Required][DisplayName("用户名")]public string Name { get; set; }=null!;[Required][DisplayName("邮箱")][RegularExpression("^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$", ErrorMessage = "E-mail is not valid")]public string Email { get; set; } = null!;[Required][DataType(DataType.Password)][DisplayName("密码")]public string Password { get; set; } = null!;[DisplayName("年龄")]public int Age{get; set;}[DisplayName("国家")]public Country Country{get;set;}[DisplayName("薪水")][Required]public string Salary{get; set;} = null!;}
<div class="mb-3 row"><label asp-for="Age" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Age" class="form-control" /></div></div><div class="mb-3 row"><label asp-for="Country" class="col-sm-1 control-label"></label><div class="col-sm-11"><select asp-for="Country" class="form-control" asp-items="@new SelectList(Enum.GetNames(typeof(Country)))"><option selected disabled value="选择">选择国家</option></select></div></div><div class="mb-3 row"><label asp-for="Salary" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Salary" class="form-control" /></div></div><div class="mb-3 row"><div class="col-sm-11 offset-sm-1"><button type="submit" class="btn btn-primary">保存</button><button asp-action="Index" class="btn btn-secondary">返回</button></div></div>
View/Admin/Update.cshtml
<div class="mb-3 row"><label asp-for="Age" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Age" class="form-control" /></div></div><div class="mb-3 row"><label asp-for="Country" class="col-sm-1 control-label"></label><div class="col-sm-11"><select asp-for="Country" class="form-control" asp-items="@new SelectList(Enum.GetNames(typeof(Country)))"><option selected disabled value="选择">选择国家</option></select></div></div><div class="mb-3 row"><label asp-for="Salary" class="col-sm-1 control-label"></label><div class="col-sm-11"><input asp-for="Salary" class="form-control" /></div></div><div class="row mb-3"><div class="col-sm-11 offset-sm-1"><button class="btn btn-primary">保存</button><button asp-action="index" class="btn btn-secondary">返回</button></div></div>
@model IEnumerable<AppUser>@{ViewData["Title"] = "用户列表";}<div class="container"><div class="row mb-3"><div class="col-sm-3"><a asp-action="Create" class="btn btn-primary">新增</a></div><div class="col-sm-3"></div><div class="col-sm-3"></div><div class="col-sm-3"></div></div><div class="row mb-3"><div class="col-sm"><table class="table table-bordered align-middle"><thead><tr><th>编号</th><th>名称</th><th>邮件</th><td>年龄</td><td>国家</td><td>薪水</td><th>编辑</th><td>删除</td></tr></thead><tbody>@foreach (AppUser user in Model){<tr><td>@user.Id</td><td>@user.UserName</td><td>@user.Email</td><td>@user.Age</td><td>@user.Country</td><td>@user.Salary</td><td><a class="btn btn-primary btn-sm" asp-action="Update" asp-route-id="@user.Id">编辑</a></td><td><form method="post" asp-action="Delete" asp-route-id="@user.Id" role="form"><button type="submit" class="btn btn-danger btn-sm">删除</button></form></td></tr>}</tbody></table></div></div></div>
最后,更新一下AdminController的Create和Update方法
Create方法
[HttpPost]public async Task<IActionResult> Create(User user){if (ModelState.IsValid){AppUser appUser = new AppUser{UserName = user.Name,Email = user.Email,Age = user.Age,Country = user.Country,Salary = user.Salary};var identityResult = await _userManager.CreateAsync(appUser, user.Password);if (identityResult.Succeeded)return RedirectToAction("Index", "Admin");elseforeach (IdentityError error in identityResult.Errors)ModelState.AddModelError("", error.Description);}return View(user);}
Update方法
[HttpPost]public async Task<IActionResult> Update(UpdateUserDTO updateUserDTO){var appUser = await _userManager.FindByIdAsync(updateUserDTO.Id);if (appUser != null){IdentityResult validEmail = null;if (!string.IsNullOrEmpty(updateUserDTO.Name) && !string.IsNullOrEmpty(updateUserDTO.Email)){appUser.UserName = updateUserDTO.Name;appUser.Email = updateUserDTO.Email;validEmail = await _userValidator.ValidateAsync(_userManager, appUser);if (!validEmail.Succeeded)Errors(validEmail);}elseModelState.AddModelError("", "用户名和邮件不能为空");appUser.Age = updateUserDTO.Age;appUser.Country = updateUserDTO.Country;if (!string.IsNullOrEmpty(updateUserDTO.Salary))appUser.Salary = updateUserDTO.Salary;IdentityResult validPass = null;if (!string.IsNullOrEmpty(updateUserDTO.Password)){validPass = await _passwordValidator.ValidateAsync(_userManager, appUser, updateUserDTO.Password);if (validPass.Succeeded)appUser.PasswordHash = _passwordHasher.HashPassword(appUser, updateUserDTO.Password);elseErrors(validPass);}elseModelState.AddModelError("", "密码不能为空");if (!string.IsNullOrEmpty(updateUserDTO.Name) &&!string.IsNullOrEmpty(updateUserDTO.Email) &&!string.IsNullOrEmpty(updateUserDTO.Password) &&validEmail.Succeeded &&validPass.Succeeded){var result = await _userManager.UpdateAsync(appUser);if (result.Succeeded)return RedirectToAction("Index");else{foreach (IdentityError error in result.Errors){ModelState.AddModelError("", error.Description);}}}}elseModelState.AddModelError("", "没有发现该用户");return View(updateUserDTO);}
2、测试客户自定义属性
2.邮件 – mary@yahoo.com
3.密码– Coder77@
4.年龄– 20
5.国家– USA
6.薪水– 5000



源代码地址:
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/AspNetCore.Identity/Identity