ОК, я наконец понял это.Этот вопрос поставил меня на правильный путь: Идентичность в 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>
Кажется, что теперь все работает так, как задумано.