使用EF与MVC创建Kit对象时无法自动填充当前登录用户UserId的问题
问题原因与解决方案
你的问题核心在于没有主动从当前登录用户获取ID并赋值给Kit对象,同时视图里的disabled输入框导致表单不会提交UserId值,最终数据库里UserId字段为NULL。下面一步步帮你解决:
一、核心问题分析
- 视图输入框的问题:你设置了
@disabled = "disabled",浏览器会忽略disabled状态的表单字段,提交时不会把UserId的值传给控制器,所以kit.UserId自然是NULL。 - 控制器逻辑缺失:你依赖表单提交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
相关产品推荐
相关产品推荐

