Список выбора модели идентификации ядра ASP.NET - PullRequest
0 голосов
/ 16 марта 2019

Я новичок в ядре asp.net (использую Core 2.1) и пытаюсь настроить модель идентификации.Я понял, как добавить настраиваемые поля, например FirstName.Тем не менее, я застрял при попытке добавить список выбора в модель для использования при регистрации.Содержимое списка должно исходить из другой таблицы в базе данных.Я расширил пользовательскую модель так, чтобы база данных имела отношение один ко многим с другой таблицей, но я не уверен, как заполнить форму регистрации содержимым другой таблицы и получить выбранное значение впользовательская таблица.Я нашел руководство о том, как сделать это с обычным контроллером, но не о том, как включить его в модель идентификации.

Конкретный сценарий состоит в том, что когда пользователи регистрируются, они должны идентифицировать уровень (например, Junior, Старший и т. Д.), Который определяет параметры, которые они видят в приложении.

Моя модель пользователя:

public class ApplicationUser : IdentityUser
{
    public ApplicationUser() : base() { }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public Level Level { get; set; }
}

Моя модель уровня:

public class Level
{
    public int Id { get; set; }

    public string LevelName { get; set; }

    public string LevelDescription { get; set; }

    public ICollection<ApplicationUser> Users { get; set; }
}

Я просто не уверен, куда идти с Register.cshtml.cs и Register.cshtml или, если есть какой-то другой способ, я должен подумать об этом.

Я пытался добавить уровень к InputModel, но я не знаю, как на самом деле заполнить список или получить идентификатор для моей модели пользователя.

public int LevelId { get; set; }
public ICollection<SelectListItem> Levels { get; set; }

Спасибо ввперед.

1 Ответ

0 голосов
/ 20 марта 2019

ОК, я наконец понял это.Этот вопрос поставил меня на правильный путь: Идентичность в ASP.Net Core 2.1: настройка AccountController .

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

Сначала я добавил ссылку на базу данных, чтобы получить доступ к таблице уровней.Я добавил 3 строки с именем «context» в файл по умолчанию, чтобы сделать базу данных доступной.

    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,
        IEmailSender emailSender,
        ApplicationDbContext context)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _logger = logger;
        _emailSender = emailSender;
        _context = context;
    }

Затем я добавил свойство в представление модели для хранения уровней (в том же разделе, что и Input иReturnUrl).

public IEnumerable<SelectListItem> Levels { get; set; }

Внутри InputModel у меня есть LevelId только потому, что я переместил уровни в модель.

    public class InputModel
    {
     ...
     public int LevelId { get; set; }
     ...
    }

Я добавил в метод OnGet, чтобы фактически заполнить модель, прежде чем она перейдет кпредставление.

    public void OnGet(string returnUrl = null)
    {
        ReturnUrl = returnUrl;

        // collect all levels from database
        List<Level> availableLevels = _context.Levels.ToList();
        // convert to selectlistitems
        Levels = availableLevels.Select(x => new SelectListItem() { Text = x.LevelName, Value = x.Id.ToString() }).ToList();
    }

OnPostAsync должен знать, что делать с выбранным уровнем, иначе он не попадет в базу данных.

   if (ModelState.IsValid)
        {
            var user = new ApplicationUser
            {
                UserName = Input.Email,
                Email = Input.Email,
                Level = _context.Levels.Where(x => x.Id == Input.LevelId).FirstOrDefault()
            };
            ...

Наконец, в Register.cshtml я добавил этот тег для отображения уровня в представлении.

       <div class="form-group">
            <label asp-for="Input.LevelId"></label>
            <select asp-for="Input.LevelId" asp-items="@(new SelectList(Model.Levels, "Value", "Text"))" class="form-control">
                <option value="">Pick One</option>
            </select>
            <span asp-validation-for="Input.LevelId" class="text-danger"></span>
        </div>

Кажется, что теперь все работает так, как задумано.

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