You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AspNetCore.Identity自定义用户数据不更新无报错且UserManager报CS0305错误

问题根因及修复方案

1. 数据不更新/提交后变NULL的问题

你的POST接口Edit方法逻辑完全写反了:你把从数据库查出来的旧用户数据覆盖了前端提交的新表单值,全程没有修改要持久化的currentUser对象就直接调用了UpdateAsync,等于没有任何修改要提交到数据库。
如果你的Edit视图没有在表单中携带Email字段,POST上来的model.Email为空会导致FindByEmailAsync查不到用户返回null,操作null对象的属性会触发空引用,后续更新操作自然会把对应字段刷为NULL。

2. 调用UserManager报错的问题

AspNetCore.Identity不提供AspNet.Identity的同步方法,你用的FindByEmail是旧版同步方法,Core版本必须使用异步方法FindByEmailAsync且需要加await关键字;另外你不能直接调用静态的UserManager类,必须使用控制器注入的_userManager泛型实例,CS0305错误就是因为你直接调用了没有指定泛型参数的静态UserManager类导致的。

修正后代码

修正GET Edit方法

需要把Email字段赋值给返回的模型,确保视图提交时能带上邮箱参数:

[HttpGet]
public async Task<IActionResult> Edit(string email)
{
    // 更安全的写法:直接从当前登录态取用户,避免前端传参被篡改
    // var currentUser = await _userManager.GetUserAsync(User);
    var appUser = await _userManager.FindByEmailAsync(email);
    if (appUser == null)
    {
        return NotFound();
    }
    UserRegistrationModel model = new UserRegistrationModel
    {
        Email = appUser.Email,
        FirstName = appUser.FirstName,
        Surname = appUser.Surname
    };
    return View(model);
}

修正POST Edit方法

把赋值逻辑反转,用表单提交的新值更新数据库用户对象,同时增加结果校验方便排查错误:

[HttpPost]
public async Task<IActionResult> Edit(UserRegistrationModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    var currentUser = await _userManager.FindByEmailAsync(model.Email);
    // 同样建议替换为从登录态取用户的写法
    if (currentUser == null)
    {
        return NotFound();
    }
    // 用表单新值更新用户对象
    currentUser.FirstName = model.FirstName;
    currentUser.Surname = model.Surname;
    // 有其他要更新的字段在这里补充赋值
    
    var updateResult = await _userManager.UpdateAsync(currentUser);
    if (updateResult.Succeeded)
    {
        return RedirectToAction("Dashboard", "MainPage");
    }
    // 打印更新错误方便排查
    foreach (var error in updateResult.Errors)
    {
        ModelState.AddModelError(string.Empty, error.Description);
    }
    return View(model);
}

额外注意

需要在你的Edit视图表单中增加Email的隐藏字段,确保提交时能带上邮箱参数:

@Html.HiddenFor(m => m.Email)

内容的提问来源于stack exchange,提问作者zarpat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 18:48:02