如何在ASP.NET 6中获取Identity Id并保存至关联数据库表
解决ASP.NET 6中自动生成控制器后UserId字段的问题
1. 清理视图与绑定参数
首先删除Create视图中自动生成的UserId选择框,因为不需要用户手动选择该字段:
<!-- 移除这段代码 --> <div class="form-group"> <label asp-for="UserId" class="control-label"></label> <select asp-for="UserId" class ="form-control" asp-items="ViewBag.UserId"></select> </div>
接着修改控制器Create方法的Bind属性,移除UserId,避免从表单接收该值:
[HttpPost] [ValidateAntiForgeryToken] // 移除Bind列表中的UserId public async Task<IActionResult> Create([Bind("Id,Name,Description")] Order order) { // 后续逻辑修改 }
2. 获取当前登录用户的ID
ASP.NET 6中User.Identity.GetUserId()已被弃用,推荐两种获取当前用户ID的方式:
方式一:通过Claims直接提取
直接从User对象的Claims中获取用户ID:
using System.Security.Claims; // 在Create方法内执行 var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
方式二:注入UserManager(类型安全)
先在OrderController构造函数中注入UserManager<ApplicationUser>:
private readonly ApplicationDbContext _context; private readonly UserManager<ApplicationUser> _userManager; public OrderController(ApplicationDbContext context, UserManager<ApplicationUser> userManager) { _context = context; _userManager = userManager; }
再在Create方法中获取当前用户:
var currentUser = await _userManager.GetUserAsync(User); var userId = currentUser?.Id;
3. 为Order赋值并保存数据
将获取到的UserId赋值给Order对象,再执行保存逻辑:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,Name,Description")] Order order) { // 获取当前用户ID(二选一即可) var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // var currentUser = await _userManager.GetUserAsync(User); // var userId = currentUser?.Id; if (string.IsNullOrEmpty(userId)) { // 处理未登录场景,比如跳转登录页 return RedirectToAction("Login", "Account"); } // 为Order对象设置UserId order.UserId = userId; if (ModelState.IsValid) { _context.Add(order); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } // 移除ViewData["UserId"]的赋值,因为视图已不再需要该数据 // ViewData["UserId"] = new SelectList(_context.Users, "Id", "Id", order.UserId); return View(order); }
4. 额外优化:清理GET方法的冗余代码
如果OrderController的GET Create方法中存在设置ViewData["UserId"]的代码,直接删除即可:
public IActionResult Create() { // 移除该行代码 // ViewData["UserId"] = new SelectList(_context.Users, "Id", "Id"); return View(); }
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

