Страница управления профилем: невозможно разрешить службу для типа при попытке активации - PullRequest
0 голосов
/ 15 апреля 2020

Я использую. Net Core 3 с шаблонами управления по умолчанию. Однако я добавил пользовательские поля UserFirstName и UserLastName. Я обновил код, чтобы правильно сохранить эту информацию при регистрации. Однако у меня возникли проблемы со страницей «Управление профилем», где мне нужно загрузить и сохранить UserFirstName и UserLastName. Я создал класс UserBO для чтения и сохранения этой информации и обновил Areas \ Identity \ Pages \ Account \ Manage \ index.cs html .cs следующим образом:

namespace InvoiceJobManager.Areas.Identity.Pages.Account.Manage
{
    public partial class IndexModel : PageModel
    {
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly SignInManager<ApplicationUser> _signInManager;
        private readonly UserBO _userBO;

        public IndexModel(
            UserManager<ApplicationUser> userManager,
            SignInManager<ApplicationUser> signInManager,
            UserBO userBO
            )
        {
            _userManager = userManager;
            _signInManager = signInManager;
            _userBO = userBO;
        }

        public string Username { get; set; }

        [TempData]
        public string StatusMessage { get; set; }

        [BindProperty]
        public InputModel Input { get; set; }

        public class InputModel
        {
            [Phone]
            [Display(Name = "Phone number")]
            public string PhoneNumber { get; set; }

            [Display(Name = "First Name")]
            public string UserFirstName { get; set; }

            [Display(Name = "Last Name")]
            public string UserLastName { get; set; }
        }

        private async Task LoadAsync(ApplicationUser user)
        {
            var userName = await _userManager.GetUserNameAsync(user);
            var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
            var fn = await _userBO.GetFirstName(new Guid(user.Id));

            Username = userName;

            Input = new InputModel
            {
                PhoneNumber = phoneNumber,
                UserFirstName = fn
            };
        }
...
        public async Task<IActionResult> OnPostAsync()
        {
...
        }

    }
}

Мой класс ApplicationUser:

public class ApplicationUser : IdentityUser
{
    public string UserFirstName { get; set; }
    public string UserLastName { get; set; }
}

Я обновил ConfigureServices следующим образом:

services
    .AddSingleton(_ => Configuration)
    .AddScoped<IUserBO, UserBO>()
    .AddMvc()
    .AddXmlSerializerFormatters()
    .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

Однако я получаю следующую ошибку времени выполнения при доступе к странице «Управление профилем»:

InvalidOperationException Не удалось разрешить службу для типа «InvoiceJobManager.BusinessObjects.UserBO» при попытке активировать «InvoiceJobManager.Areas.Identity.Pages.Account.Manage.IndexModel». Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider sp, Тип типа, Тип requiredBy, bool isDefaultParameterRequired)

InvalidOperationException: Невозможно разрешить службу для типа «InvoiceJobManager.BusinessObjects.JobjectSigner» Areas.Identity.Pages.Account.Manage.IndexModel. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService (IServiceProvider зр, тип тип, тип requiredBy, BOOL isDefaultParameterRequired) lambda_method (Закрытие, IServiceProvider, объект []) Microsoft.AspNetCore. * +1021 * .RazorPages.Infrastructure.DefaultPageModelActivatorProvider + <> c__DisplayClass1_0.b__0 (Контекст контекста страницы) .RazorPages.Infrastructure.PageActionInvoker.Next (ref State next, ref Область действия, состояние объекта ref, ref bool isCompleted) Microsoft.AspNetCore. Mvc .RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsyn cIn. Microsoft. 1027 * .Infrastructure.ResourceInvoker.g__Awaited | 24_0 (ResourceInvoker invoker, Task lastTask, State next, область действия области, состояние объекта, bool isCompleted) Microsof t.AspNetCore. Mvc .Infrastructure.ResourceInvoker.Rethrow (контекст ResourceExecutedContextSealed) . Mvc .Infrastructure.ResourceInvoker.InvokeFilterPipelineAsyn c () Microsoft.AspNetCore. Mvc .Infrastructure.ResourceInvoker.g__Awaited | 17_0 (активатор ресурса ResourceInvoker, задача задачи, IDisposable scope) 6_0 (конечная точка конечной точки, задача TaskTask, средство ведения журнала ILogger) контекст) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCor e.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

*1016* Конечно, прямая инъекция и возможность вызывать все, что я мог бы сделать, вызывая прямую инъекцию и вызывая зависимость база данных, но это было бы не очень чисто. Каков наилучший способ исправить это?

1 Ответ

0 голосов
/ 21 апреля 2020

Что за пукающий мозг !!!

Сначала я проверил user.UserFirstName и user.UserLastName в LoadAsync, и я уверен, что он был нулевым. Я перепроверил сегодня и обнаружил, что это не так и имеет правильные значения. Таким образом, реализация очень проста:

private async Task LoadAsync(ApplicationUser user)
{
    var userName = await _userManager.GetUserNameAsync(user);
    var phoneNumber = await _userManager.GetPhoneNumberAsync(user);

    Username = userName;

    Input = new InputModel
    {
        PhoneNumber = phoneNumber,
        UserFirstName = user.UserFirstName,  // Added this line
        UserLastName = user.UserLastName     // Added this line
    };
}


public async Task<IActionResult> OnPostAsync()
{
    var user = await _userManager.GetUserAsync(User);

    if (user == null)
    {
        return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
    }

    if (!ModelState.IsValid)
    {
        await LoadAsync(user);
        return Page();
    }

    user.UserFirstName = Input.UserFirstName;   // Added this line
    user.UserLastName = Input.UserLastName;     // Added this line

    var phoneNumber = await _userManager.GetPhoneNumberAsync(user);

    if (Input.PhoneNumber != phoneNumber)
    {
        var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);

        if (!setPhoneResult.Succeeded)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            throw new InvalidOperationException($"Unexpected error occurred setting phone number for user with ID '{userId}'.");
        }
    }

    await _userManager.UpdateAsync(user);   // Added this line

    await _signInManager.RefreshSignInAsync(user);
    StatusMessage = "Your profile has been updated";
    return RedirectToPage();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...