ASP.NET Core 6.0中如何获取数据库用户名实现重复校验?
注册用户名重复检查解决方案(ASP.NET 6 Razor Pages)
核心优化点
不用把所有用户数据拉到内存里对比,直接通过EF Core的Any()方法在数据库层面做查询,更高效也更简洁。
修改步骤
- 替换用户名检查逻辑
把你代码中注释的检查部分:
if (TempUser.Username == //database UserName value here ) { //Here would be where the Username is compared //UniUsername = false; }
替换成:
// 检查数据库中是否已存在相同用户名,如需不区分大小写可添加StringComparison.OrdinalIgnoreCase if (_context.User.Any(u => u.UserName == TempUser.Username)) { UniUsername = false; }
- 移除不必要的全量查询
删掉代码里的UserList = _context.User.ToList();,现在不需要把所有用户加载到内存中,节省资源。
修改后的完整OnPost方法代码
public IActionResult OnPost() { User User = new User(); HasPassword = true; HasUsername = true; UniUsername = true; SubjectChosen = true; if (!AQAMaths && !AQAPhys) { SubjectChosen = false; } if (string.IsNullOrWhiteSpace(TempUser.Password) || TempUser.Password.Length < 4) { HasPassword = false; } if (string.IsNullOrWhiteSpace(TempUser.Username) || TempUser.Username.Length < 4) { HasUsername = false; } // 新增的用户名重复检查逻辑 if (_context.User.Any(u => u.UserName == TempUser.Username)) { UniUsername = false; } if (!HasPassword || !HasUsername || !UniUsername || !SubjectChosen) { return RedirectToPage("/UserLogin/RegisterPage", new { HasPassword, HasUsername, UniUsername, SubjectChosen }); } else { RegisterApproved = true; User.UserName = TempUser.Username; User.UserPass = TempUser.Password; User.UserCorrectAnsw = 0; User.UserTotalAnsw = 0; _context.User.Add(User); _context.SaveChanges(); return RedirectToPage("/UserLogin/LoginPage", new { RegisterApproved }); } }
额外保障(可选)
为了彻底避免重复用户名,建议在数据库的User表UserName字段上添加唯一约束,即使代码层面有疏漏,数据库也会阻止重复数据插入。可以通过EF Core的Fluent API配置:
在ApplicationDbContext的OnModelCreating方法中添加:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasIndex(u => u.UserName) .IsUnique(); }
执行数据库迁移更新即可生效。
内容的提问来源于stack exchange,提问作者AshbyS
相关产品推荐
相关产品推荐

