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

使用EF与MVC创建Kit对象时无法自动填充当前登录用户UserId的问题

问题原因与解决方案

你的问题核心在于没有主动从当前登录用户获取ID并赋值给Kit对象,同时视图里的disabled输入框导致表单不会提交UserId值,最终数据库里UserId字段为NULL。下面一步步帮你解决:

一、核心问题分析

  1. 视图输入框的问题:你设置了@disabled = "disabled",浏览器会忽略disabled状态的表单字段,提交时不会把UserId的值传给控制器,所以kit.UserId自然是NULL。
  2. 控制器逻辑缺失:你依赖表单提交UserId,但既没让用户输入(输入框禁用),也没在代码里主动从当前登录用户获取ID赋值,这就导致没有值写入数据库。

二、具体修复步骤

1. 修改控制器Create方法

首先移除Bind里的UserId(不需要从表单接收),然后在保存前主动获取当前登录用户的ID赋值给Kit对象:

// 记得添加这个命名空间,不然GetUserId()方法会报错
using Microsoft.AspNet.Identity;

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin")]
public ActionResult Create([Bind(Include = "KitId,KitName,ProductId")] Kit kit) {
    if (ModelState.IsValid) {
        // 关键:获取当前登录用户的ID并赋值
        kit.UserId = User.Identity.GetUserId();
        db.Kits.Add(kit);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.ProductId = new SelectList(db.Products, "ProductId", "ProductName", kit.ProductId);
    // 不需要再传递ViewBag.UserId了,因为我们不再让用户选择或输入
    return View(kit);
}

2. 修改视图代码

既然UserId是自动填充的,不需要用户输入,你可以直接移除原来的UserId输入框,或者改成显示当前登录用户的信息(只读):

<!-- 如果需要显示当前登录用户的邮箱,用这段代替原来的UserId输入框 -->
<div class="form-group">
    @Html.Label("Current Assigned User", htmlAttributes: new { @class = "control-label col-md-2"})
    <div class="col-md-10">
        <p class="form-control-static">@User.Identity.Name</p>
    </div>
</div>

如果完全不需要显示用户信息,直接删掉原来的UserId相关div即可。

三、额外说明

  • 如果你用的是ASP.NET Core MVC(而非传统ASP.NET MVC 5),GetUserId()方法被替换成了User.FindFirstValue(ClaimTypes.NameIdentifier),记得调整代码并添加using System.Security.Claims;命名空间。
  • 移除Bind里的UserId是为了安全,避免恶意用户通过修改表单提交自定义的UserId值,确保UserId始终由系统从当前登录用户获取。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:33:23