ASP.NET Core Identity如何新增独立Name字段而非复用Username
问题解决方案
AspNetUsers表说明
AspNetUsers是ASP.NET Core Identity默认的用户存储表,你在该表中新增独立的Name列来存储用户姓名是完全正确的做法。
验证规则冲突的解决步骤
系统将Name字段按Username规则验证,核心原因是Name字段的绑定或验证逻辑和Username发生了混淆,按以下步骤排查修复:
1. 修正InputModel的验证特性
打开Register.cshtml.cs中的InputModel,确保Name属性使用独立的验证规则,不要继承Username的专属验证特性(比如[UserName]、针对Username的正则表达式)。示例代码:
public class InputModel { [Required] [Display(Name = "姓名")] [StringLength(100, ErrorMessage = "{0}长度不能超过{1}个字符。")] public string Name { get; set; } [Required] [Display(Name = "用户名")] [UserName] // 仅Username使用该专属验证特性 [RegularExpression(@"^[a-zA-Z0-9_]+$", ErrorMessage = "用户名仅允许字母、数字和下划线")] public string UserName { get; set; } // 邮箱、密码等其他字段... }
2. 确认视图字段绑定正确性
检查Register.cshtml中的Name表单控件,确保绑定的是Input.Name而非Input.UserName,避免输入的姓名内容错误绑定到用户名字段触发验证:
<div class="form-group"> <label asp-for="Input.Name"></label> <input asp-for="Input.Name" class="form-control" /> <span asp-validation-for="Input.Name" class="text-danger"></span> </div>
3. 修正用户创建逻辑
在OnPostAsync方法中,确认是将Input.Name赋值给ApplicationUser.Name,而非错误赋值给UserName:
public async Task<IActionResult> OnPostAsync(string returnUrl = null) { returnUrl ??= Url.Content("~/"); if (ModelState.IsValid) { // 正确赋值:Name字段对应ApplicationUser.Name var user = new ApplicationUser { UserName = Input.UserName, Email = Input.Email, Name = Input.Name }; var result = await _userManager.CreateAsync(user, Input.Password); // 后续逻辑... } // 返回视图... }
4. 确认实体类属性配置
检查ApplicationUser类的Name属性,确保配置正确,比如无需额外指定列名的情况下,属性名Name会自动映射到数据库的Name列:
public class ApplicationUser : IdentityUser { public string Name { get; set; } }
内容的提问来源于stack exchange,提问作者Robert Young
相关产品推荐
相关产品推荐

