Как расширить UserManager с помощью сеттеров в .NET Core Razor Pages? - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над веб-приложением с .NET Core 2 Razor Pages и аутентификацией отдельных учетных записей.

Я расширил свою базу данных именем, так как он не реализован в соответствии со стандартом. Все работает правильно. Тем не менее, я хотел бы расширить свою страницу / 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;
    }
}

Не удается, когда я нажимаю кнопку «Сохранить», и сообщает, что мой профиль был успешно обновлен, но этого не произошло. Он просто сохранил старое имя. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 02 мая 2018

Ваш метод не делает того, что делают аналогичные встроенные методы: а именно, фактически сохраняет изменение обратно в базу данных. Вы просто устанавливаете свойство для пользователя и затем возвращаете успех. Как только этот экземпляр выходит из области видимости, значение, указанное для имени, идет вместе с ним.

Тем не менее, комментарий @ CodeNotFound является существенным. Там нет причин, чтобы сделать это, и вы не должны. Другие методы существуют для особых случаев использования. Для обычного обновления свойств вашего пользователя вы должны просто установить соответствующее свойство и затем использовать UpdateAsync, чтобы сохранить пользователя обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...