首页 > 解决方案 > 在 ASP.NET Core MVC 中修改用户数据

问题描述

我正在尝试实现一个功能,让超级管理员修改常规管理员帐户的数据,但我遇到了“用户安全标记不能为空”的错误。但是在数据库中,填写了 SecurityStamp 字段。

这是我的 Admin 类,它继承自自定义的 ApplicationUser 类,还没有额外的字段。

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>

谢谢您的帮助!

标签: c#asp.net-mvcasp.net-core.net-coreasp.net-identity

解决方案


SecurityStamp 是一个必需的字段。您必须在视图表单内的某处为 Model.SecurityStamp 创建一个隐藏输入

<input type="hidden" asp-for="SecurityStamp" value="@Model.SecurityStamp" />

推荐阅读