You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:32:01