c# - 如何在 .NET Core Razor 页面中使用 Setter 扩展 UserManager?

标签 c# asp.net-core asp.net-core-identity razor-pages

我正在使用 .NET Core 2 Razor Pages 和个人帐户身份验证开发 Web 应用程序。

我用名字扩展了我的数据库,因为它不是按标准实现的。一切正常。但是,我想扩展我的/Account/Manage 页面,以确保用户能够更改自己的名称。

OnGetAsync 工作正常,但是当我的 OnPostAsync 无法正常工作时。

OnPostAsync

 public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        var user = await _userManager.GetUserAsync(User);
        if (user == null)
        {
            throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
        }

        if (Input.Email != user.Email)
        {
            var setEmailResult = await _userManager.SetEmailAsync(user, Input.Email);
            if (!setEmailResult.Succeeded)
            {
                throw new ApplicationException($"Unexpected error occurred setting email for user with ID '{user.Id}'.");
            }
        }

        if (Input.PhoneNumber != user.PhoneNumber)
        {
            var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
            if (!setPhoneResult.Succeeded)
            {
                throw new ApplicationException($"Unexpected error occurred setting phone number for user with ID '{user.Id}'.");
            }
        }

        // not working yet
        if (Input.FirstName != user.FirstName)
        {
            var setFirstNameResult = await MyManager.SetFirstNameAsync(user, Input.FirstName);

            if (!setFirstNameResult.Succeeded)
            {
                throw new ApplicationException($"Unexpected error occurred setting first name for user with ID '{user.Id}'.");
            }
        }

        StatusMessage = "Your profile has been updated";
        return RedirectToPage();
    }

MyManager.cs

public class MyManager : UserManager<ApplicationUser>
{
    public MyManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators, IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<ApplicationUser>> logger) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
    {

    } 

    public static async Task<IdentityResult> SetFirstNameAsync(ApplicationUser user, string FirstName)
    {
        if (user == null)
        {
            throw new ArgumentNullException(nameof(user));
        }

        if (FirstName == null)
        {
            throw new ArgumentNullException(nameof(FirstName));
        }

        user.FirstName = FirstName;

        return IdentityResult.Success;
    }
}

当我点击“保存”按钮并告诉我我的个人资料已成功更新时,它失败了,但事实并非如此。它只保留了旧的名字值。我在这里缺少什么?

最佳答案

您的方法不执行类似内置方法的操作:即,实际上将更改保留回数据库。您只需在用户上设置属性,然后返回成功即可。一旦该实例超出范围,您为名字设置的值就会随之消失。

也就是说,@CodeNotFound 的评论很重要。没有理由这样做,你也不应该这样做。其他方法适用于特定用例。对于一般更新用户属性的情况,您只需设置相关属性,然后使用 UpdateAsync 将用户保存回来。

关于c# - 如何在 .NET Core Razor 页面中使用 Setter 扩展 UserManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50134835/

相关文章:

c# - 将矩形拆分为 n 个较小的矩形并计算每个中心的算法

c# - System.Threading.Timer 不触发我的 TimerCallBack 委托(delegate)

c# - 如何在 ASP.NET Core MVC 中完成这个 nl 到 br 的功能?

asp.net-core-mvc - 将 .Net Core Identity 与通用存储库一起使用

asp.net-core - 从访问 token Web Api Asp.net Core 获取用户信息

c# - 将 JSON 文件夹结构反序列化为 C# 对象

c# - 如何按属性对列表进行排序并对 HTML Razor 中的元素进行分组?

c# - 在 ASP.NET Core 中到达 Controller 之前拦截不良请求

c# - Asp.Net Core WEB API调用方法报错404

c# - 在 Linux 上的 ASP.NET Core MVC 项目中使用身份脚手架后运行项目时出现问题