【发布时间】:2019-12-16 14:44:34
【问题描述】:
我正在关注从 Asp Docs 创建自定义 IdentityUser 的演示。我相信的默认 IdentityUser 只记录了用户名、电子邮件和密码。当我注册一个新帐户时,它实际上会记录到 AspNetUser 表中。但是,在我的情况下,我还想记录诸如 FirstName、LastName、DOB 等内容,并且由于默认情况下不记录这些内容,因此我需要创建自定义 IdentityUser。在按照 aspnet 文档实现自定义身份并更新视图的 html 之后,我收到了这个:
https://gyazo.com/5e1494dccc44d3cd03d24bf48816caf9(screenshot)
我不确定它从哪里接收“无效的列名”,我的 VisUser(自定义 IdentityUser)中的列名与我的 sql server VisUser 表中的列名匹配。
数据库上下文:
public class dbContext : IdentityDbContext<VisUser>
{
public dbContext(DbContextOptions<dbContext> options)
: base(options)
{
}
public DbSet<VisUser> VisUsers { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
}
访问用户
public class VisUser : IdentityUser
{
[Key]
public int UserId { get; set; }
[BindProperty]
[Required]
[MinLength(0), MaxLength(50), DataType(DataType.Text), Display(Name = "FirstName")]
public string FirstName { get; set; }
[BindProperty]
[Required]
[MinLength(0), MaxLength(2), DataType(DataType.Text), Display(Name = "Middle Initial")]
public string MiddleInitial { get; set; }
[BindProperty]
[Required]
[MinLength(1), MaxLength(50), DataType(DataType.Text), Display(Name = "Last Name")]
public string LastName { get; set; }
[BindProperty]
[Required]
[MinLength(4), MaxLength(50), DataType(DataType.Text), Display(Name = "Username")]
public string VisUserName { get; set; }
[BindProperty]
[Required]
[EmailAddress, MaxLength(256), Display(Name = "Email Address")]
public string VisEmail { get; set; }
[BindProperty]
[Required]
[MinLength(6), MaxLength(50), DataType(DataType.Password), Display(Name = "UserPassword")]
public string UserPassword { get; set; }
}
注册页面视图的 HTML
<div class="row">
<div class="col-md-4">
<form asp-route-returnUrl="@Model.ReturnUrl" method="post">
<h4>Create a new account.</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Input.FirstName"></label>
<input asp-for="Input.FirstName" class="form-control" />
<span asp-validation-for="Input.FirstName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.MiddleInitial"></label>
<input asp-for="Input.MiddleInitial" class="form-control" />
<span asp-validation-for="Input.MiddleInitial" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.LastName"></label>
<input asp-for="Input.LastName" class="form-control" />
<span asp-validation-for="Input.LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.VisEmail"></label>
<input asp-for="Input.VisEmail" class="form-control" />
<span asp-validation-for="Input.VisEmail" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.VisUserName"></label>
<input asp-for="Input.VisUserName" class="form-control" />
<span asp-validation-for="Input.VisUserName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Input.UserPassword"></label>
<input asp-for="Input.UserPassword" class="form-control" />
<span asp-validation-for="Input.UserPassword" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Register</button>
</form>
</div>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
注册模型:
[AllowAnonymous]
public class RegisterModel : PageModel
{
private readonly SignInManager<VisUser> _signInManager;
private readonly UserManager<VisUser> _userManager;
private readonly ILogger<RegisterModel> _logger;
private readonly IEmailSender _emailSender;
public RegisterModel(
UserManager<VisUser> userManager,
SignInManager<VisUser> signInManager,
ILogger<RegisterModel> logger,
IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
_emailSender = emailSender;
}
[BindProperty]
public InputModel Input { get; set; }
public string ReturnUrl { get; set; }
public class InputModel : VisUser
{
}
public void OnGet(string returnUrl = null)
{
ReturnUrl = returnUrl;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var user = new VisUser { UserName = Input.VisUserName, Email = Input.VisEmail };
var result = await _userManager.CreateAsync(user, Input.UserPassword);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
}
当我运行它时,我收到了我的列名无法找到或不匹配的错误。我希望将 VisUser 的信息存储在 sql server 中的 VisUser 表中,并将 AspNetUser 的相关信息也存储在那里,以便我可以使用 SigninManager、UserManager 等操作。希望你能提供帮助提前谢谢你!
【问题讨论】:
标签: c# sql-server asp.net-core-2.1