首页 > 解决方案 > 编辑自定义 UserIdentity 对象(在数据库中)

问题描述

我正在使用 ASP.NET Identity 制作我的第一个 ASP.NET Core 应用程序。我现在设法创建了一个自定义IdentityUser类(名为ApplicationUser),它从脚手架 Identity 包中提供的标准 IdentityUser 类扩展而来。ApplicationUser现在有一些额外的字段(地址、状态、名字、姓氏),并且我的应用程序和数据库都以所需的方式识别,并且在使用注册表单时新用户被正确添加到数据库中。当然,我已经替换了IdentityUserwith的用法ApplicationUser,并自定义了

注册.cshtml

注册.cshtml.cs

,以便使用额外的字段。我现在的问题是,我觉得我不知道应该如何在“自然意义上”更新用户对象(在数据库中)。默认值UserManager似乎是为更新默认值的实例而设计的IdentityUser,而不是为继承自的类而设计的IdentityUser。似乎UserManager默认情况下处理异步操作等问题,并且我怀疑有任何用途的唯一(默认)可用方法是#UpdateAsyncUserManager. 我能做些什么?

标签: asp.net-mvcasp.net-core.net-core

解决方案


这是一个关于如何更新 ApplicationUser 的工作演示:

模型:

public class ApplicationUser:IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

看法:

@model ApplicationUser
<form asp-action="UpdateUser">
    <div>
        <label asp-for="Email"></label>
        <input asp-for="Email" />
    </div>
    <div>
        <label asp-for="FirstName"></label>
        <input asp-for="FirstName" />
    </div>
    <div>
        <label asp-for="LastName"></label>
        <input asp-for="LastName" />
    </div>
    <input type="submit" value="update" />
</form>

控制器:

public class HomeController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;
    public HomeController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }
    
    [HttpPost]
    public IActionResult UpdateUser(ApplicationUser applicationUser)
    {
        var user = _userManager.FindByEmailAsync(applicationUser.Email).Result;
        //modify the data...
        user.FirstName = applicationUser.FirstName;
        user.LastName = applicationUser.LastName;
        var result = _userManager.UpdateAsync(user).Result;
        return RedirectToAction("Index");
    }
}

应用程序上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

启动.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = false)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
}

推荐阅读