#asp.net-core #asp.net-identity
#asp.net-ядро #asp.net-идентификация
Вопрос:
Новичок в ASP.NET Ядро. Я использую Identity framework для аутентификации, среди прочего, используя страницу Register razor. В Register.cshtml.cs
я хотел бы получить данные для заполнения выпадающего меню. Данные находятся в другой части таблиц Entity Framework. Таким образом, цель состоит в том, чтобы иметь возможность выбирать, например, «Компанию» при регистрации пользователя.
Мне не нравится слишком много возиться с Register.cshtml.cs
, т. Е. Изменять конструктор, чтобы использовать мои собственные сервисы и / или контекстные объекты. Но как получить доступ к «моим собственным» таблицам с этой страницы?
Можно ли это сделать? Или это не должно быть сделано (почему?)? И если нет, какие-либо советы по созданию этого общего пользовательского администрирования в сочетании с Identity framework?
Спасибо,
Palle
Ответ №1:
Чем ASP.NET Core Identity используется для управления пользователями, паролями, данными профиля, ролями, утверждениями, токенами, подтверждением по электронной почте и многим другим. Мы можем использовать UserManager, RoleManager и SignInManager для управления следующими таблицами:
Более подробную информацию об идентификации см. В разделе Идентификация на ASP.NET Ядро.
Чтобы получить доступ к другим таблицам Entity Framework, я думаю, вам нужно использовать контекст базы данных в Register.cshtml.cs, например:
public class RegisterModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ILogger<RegisterModel> _logger;
private readonly IEmailSender _emailSender;
private readonly ApplicationDbContext _context;
public RegisterModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
ILogger<RegisterModel> logger,
ApplicationDbContext context,
IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
_context = context;
_emailSender = emailSender;
}
[BindProperty]
public InputModel Input { get; set; }
public string ReturnUrl { get; set; }
[BindProperty]
public List<Company> Companies { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }
public class InputModel
{
...
}
public async Task OnGetAsync(string returnUrl = null)
{
ReturnUrl = returnUrl;
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
Companies = _context.Companies.ToList(); //get all companies from database.
}
Кроме того, если вы все еще не хотите использовать контекст базы данных. Вы могли бы рассмотреть возможность установки списка выбранных элементов с фиксированными параметрами или использования списка перечислений, не получая их из базы данных.
Комментарии:
1. Спасибо, Чжи, в итоге я сделал именно это, хотя и со ссылкой на собственную зарегистрированную службу, а не непосредственно на контекст БД. Но очень полезно подтвердить это, так что еще раз спасибо.