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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:17:03