首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >注册与.NET核心标识名字段错误-“用户名‘是无效的,只能包含字母或数字。”

注册与.NET核心标识名字段错误-“用户名‘是无效的,只能包含字母或数字。”
EN

Stack Overflow用户
提问于 2022-10-19 13:09:13
回答 2查看 132关注 0票数 1

我使用默认字段(“电子邮件”、“密码”、“确认密码”)和自定义字段“名称”创建了一个带有ASP.NET核心标识的注册表单。当我在name字段中输入一个随机字符串值并按下“寄存器”时,我总是收到以下错误消息:

“用户名‘无效,只能包含字母或数字。”

我尝试过的事情:

  • 我已经为AllowedUserNameCharacters设置了“User”对象的选项,但这似乎没有什么区别:
代码语言:javascript
运行
复制
    services.Configure<IdentityOptions>(options =>
                {
                    options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    }

我的登记主任:

代码语言:javascript
运行
复制
    [HttpPost]
    public async Task<IActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser
            {
                Name = model.Name,                    
                Email = model.Email
            };  
    
            var result = await _userManager.CreateAsync(user, model.Password);
    
            if (result.Succeeded)
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
    
                return RedirectToAction("index", "Home");
            }
    
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError("", error.Description);
            }
    
            ModelState.AddModelError(string.Empty, "Invalid Login Attempt");
        }
    
        return View(model);
    }

调整视图:

代码语言:javascript
运行
复制
    <form method="post">
                <div asp-validation-summary="All" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="Name"></label>
                    <input asp-for="Name" class="form-control" />
                    <span asp-validation-for="Name" class="text-danger"></span>
                </div>
    
    
                <div class="form-group">
                    <label asp-for="Email"></label>
                    <input asp-for="Email" class="form-control" />
                    <span asp-validation-for="Email" class="text-danger"></span>
                </div>
    
                <div class="form-group">
                    <label asp-for="Password"></label>
                    <input asp-for="Password" class="form-control" />
                    <span asp-validation-for="Password" class="text-danger"></span>
                </div>
    
                <div class="form-group">
                    <label asp-for="ConfirmPassword"></label>
                    <input asp-for="ConfirmPassword" class="form-control" />
                    <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
                </div>
                <button type="submit" class="btn-primary">Register</button>
    
    
            </form>
代码语言:javascript
运行
复制
My appDBContext:

    public class AppDBContext : IdentityDbContext<ApplicationUser>
    {
        private readonly DbContextOptions _options;

        public AppDBContext()
        {

        }

        public AppDBContext(DbContextOptions options): base(options)
        {
            _options = options;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(
                @"Server=(localdb)\mssqllocaldb;Database=Codefirst");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<ApplicationUser>()
            .Property(e => e.Name)
            .HasMaxLength(250);

            modelBuilder.Entity<ApplicationUser>()
            .Property(e => e.Email)
            .HasMaxLength(250);
        }
    }
代码语言:javascript
运行
复制
My applicationuser.cs class:
代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;

namespace SLE_System.Data
{
    public class ApplicationUser : IdentityUser
    {
        public string Name { get; set; }

        public string Email { get; set; }

        public string Password { get; set; }

        public string ConfirmPassword { get; set; }
    }
}
代码语言:javascript
运行
复制
If anyone has any ideas, these would be much appreciated?

Thanks,

Robert
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-20 07:42:52

"UserName" is invalid, can only contain letters or digits.是关于UserName属性的默认错误消息。在正则视图中,没有UserName的输入,所以当您使用CreateAsync()方法注册用户时,项目将验证您的属性并发现UserName属性为null并返回此错误消息。

因此,一个简单的方法是在注册ApplicationUser时给它一个值。

代码语言:javascript
运行
复制
[HttpPost]
    public async Task<IActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser
            {
                Name = model.Name,
                UserName = model.Name,                    
                Email = model.Email
            };  
            //.......

但是请注意,当您输入Name属性时,您需要满足UserName的验证规则。

代码语言:javascript
运行
复制
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+"

还可以通过以下方法自定义它的验证规则:

代码语言:javascript
运行
复制
services.Configure<IdentityOptions>(options =>
                {
                    options.User.AllowedUserNameCharacters = "xxxxxx";
                    //..............
票数 0
EN

Stack Overflow用户

发布于 2022-10-19 13:48:10

这里IdentiyUser类是继承的

代码语言:javascript
运行
复制
public class ApplicationUser : IdentityUser
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
}

而且,IdentityUser类具有以下属性,根据Microsoft,有属性IdentityUser,它也是继承的。

默认情况下,(非空属性)数据类型具有默认数据注释(“AllowEmptyStrings”=true).Since,而发送已注册数据的UserName缺失,但它是必需的,因此正在抛出错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74125932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档