修改 ASP.NET 核心 MVC 中的用户数据
Modifying User data in ASP.NET Core MVC
我正在尝试实现一项功能,让超级管理员修改普通管理员帐户的数据,但我 运行 出现“用户安全标记不能为空”的错误。但是在数据库中,填充了 SecurityStamp 字段。
这是我的 Admin class,它继承自自定义的 ApplicationUser class,还没有额外的字段。
public abstract class ApplicationUser : IdentityUser<int>
{
//STORED FIELDS
[Required, StringLength(50, MinimumLength = 3), PersonalData]
public string FirstName { get; set; }
[Required, StringLength(50, MinimumLength = 3), PersonalData]
public string LastName { get; set; }
[Required, StringLength(6, MinimumLength = 6), PersonalData]
public string NeptunCode { get; set; }
public int UsernameChangeLimit { get; set; } = 10;
[PersonalData]
public byte[] ProfilePicture { get; set; }
//CALCULATED FIELDS
public string FullName => FirstName + " " + LastName;
}
public class Admin : ApplicationUser
{
}
这是我的 AdminController 和 AdminService 方法。
[HttpPost, ValidateAntiForgeryToken]
public async Task<IActionResult> Modify(int? id, Admin admin)
{
if (id != admin.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
await _adminService.UpdateAdminAsync(admin);
return RedirectToAction(nameof(Index));
}
return View(admin);
}
public async Task<bool> UpdateAdminAsync(Admin admin)
{
await _userManager.UpdateAsync(admin);
return await _context.SaveChangesAsync() == 1;
}
最后,Modify.cshtml
<form asp-action="Modify">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Id" />
<div class="form-group text-center">
<label asp-for="FirstName" class="control-label"></label>
<input asp-for="FirstName" class="form-control text-center" />
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="LastName" class="control-label"></label>
<input asp-for="LastName" class="form-control text-center" />
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="UserName" class="control-label"></label>
<input asp-for="UserName" class="form-control text-center" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control text-center" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group form-check text-center">
<label class="form-check-label">
<input class="form-check-input" asp-for="EmailConfirmed" /> @Html.DisplayNameFor(model => model.EmailConfirmed)
</label>
</div>
<div class="form-group text-center">
<label asp-for="NeptunCode" class="control-label"></label>
<input asp-for="NeptunCode" class="form-control text-center" />
<span asp-validation-for="NeptunCode" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="PhoneNumber" class="control-label"></label>
<input asp-for="PhoneNumber" class="form-control text-center" />
<span asp-validation-for="PhoneNumber" class="text-danger"></span>
</div>
<div class="form-group form-check text-center">
<label class="form-check-label">
<input class="form-check-input" asp-for="PhoneNumberConfirmed" /> @Html.DisplayNameFor(model => model.PhoneNumberConfirmed)
</label>
</div>
<div class="form-group text-center">
<input type="submit" value="Save" class="btn btn-primary btn-block" />
<a asp-action="Index" class="btn btn-outline-primary btn-block">Back to List</a>
</div>
</form>
感谢您的帮助!
安全戳是必填字段。您必须在视图表单
的某处为 Model.SecurityStamp 创建隐藏输入
<input type="hidden" asp-for="SecurityStamp" value="@Model.SecurityStamp" />
我正在尝试实现一项功能,让超级管理员修改普通管理员帐户的数据,但我 运行 出现“用户安全标记不能为空”的错误。但是在数据库中,填充了 SecurityStamp 字段。
这是我的 Admin class,它继承自自定义的 ApplicationUser class,还没有额外的字段。
public abstract class ApplicationUser : IdentityUser<int>
{
//STORED FIELDS
[Required, StringLength(50, MinimumLength = 3), PersonalData]
public string FirstName { get; set; }
[Required, StringLength(50, MinimumLength = 3), PersonalData]
public string LastName { get; set; }
[Required, StringLength(6, MinimumLength = 6), PersonalData]
public string NeptunCode { get; set; }
public int UsernameChangeLimit { get; set; } = 10;
[PersonalData]
public byte[] ProfilePicture { get; set; }
//CALCULATED FIELDS
public string FullName => FirstName + " " + LastName;
}
public class Admin : ApplicationUser
{
}
这是我的 AdminController 和 AdminService 方法。
[HttpPost, ValidateAntiForgeryToken]
public async Task<IActionResult> Modify(int? id, Admin admin)
{
if (id != admin.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
await _adminService.UpdateAdminAsync(admin);
return RedirectToAction(nameof(Index));
}
return View(admin);
}
public async Task<bool> UpdateAdminAsync(Admin admin)
{
await _userManager.UpdateAsync(admin);
return await _context.SaveChangesAsync() == 1;
}
最后,Modify.cshtml
<form asp-action="Modify">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Id" />
<div class="form-group text-center">
<label asp-for="FirstName" class="control-label"></label>
<input asp-for="FirstName" class="form-control text-center" />
<span asp-validation-for="FirstName" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="LastName" class="control-label"></label>
<input asp-for="LastName" class="form-control text-center" />
<span asp-validation-for="LastName" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="UserName" class="control-label"></label>
<input asp-for="UserName" class="form-control text-center" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control text-center" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group form-check text-center">
<label class="form-check-label">
<input class="form-check-input" asp-for="EmailConfirmed" /> @Html.DisplayNameFor(model => model.EmailConfirmed)
</label>
</div>
<div class="form-group text-center">
<label asp-for="NeptunCode" class="control-label"></label>
<input asp-for="NeptunCode" class="form-control text-center" />
<span asp-validation-for="NeptunCode" class="text-danger"></span>
</div>
<div class="form-group text-center">
<label asp-for="PhoneNumber" class="control-label"></label>
<input asp-for="PhoneNumber" class="form-control text-center" />
<span asp-validation-for="PhoneNumber" class="text-danger"></span>
</div>
<div class="form-group form-check text-center">
<label class="form-check-label">
<input class="form-check-input" asp-for="PhoneNumberConfirmed" /> @Html.DisplayNameFor(model => model.PhoneNumberConfirmed)
</label>
</div>
<div class="form-group text-center">
<input type="submit" value="Save" class="btn btn-primary btn-block" />
<a asp-action="Index" class="btn btn-outline-primary btn-block">Back to List</a>
</div>
</form>
感谢您的帮助!
安全戳是必填字段。您必须在视图表单
的某处为 Model.SecurityStamp 创建隐藏输入<input type="hidden" asp-for="SecurityStamp" value="@Model.SecurityStamp" />