在两个Model或Razor Pages之间传递ID问题求助
解决.NET Core Razor中新增用户后ID传递为空的问题
看起来你遇到的问题很典型——EF Core中新增实体后,主键ID没有被正确传递到后续页面。我来帮你一步步排查和解决:
第一步:确认保存实体后ID已被正确赋值
EF Core中,当你把实体添加到_Context后,必须调用SaveChanges()或await SaveChangesAsync(),数据库才会生成主键ID并赋值回你的实体对象。如果跳过这一步,实体的ID会保持默认值(比如0或者null,取决于你的ID类型)。
举个正确的示例(Razor Pages的OnPostAsync方法):
public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } // 添加新用户到上下文 _context.Users.Add(NewUser); // 关键:保存到数据库,此时NewUser.Id会被赋值 await _context.SaveChangesAsync(); // 现在NewUser.Id已经是数据库生成的有效值了 return RedirectToPage("./UserDetails", new { id = NewUser.Id }); }
如果是MVC控制器,逻辑类似:
public async Task<IActionResult> Create(UserCreateViewModel model) { if (ModelState.IsValid) { var user = new User { Name = model.Name, Email = model.Email // 其他属性赋值 }; _context.Users.Add(user); await _context.SaveChangesAsync(); // 跳转时直接传递已赋值的user.Id return RedirectToAction("Details", "User", new { id = user.Id }); } return View(model); }
第二步:检查视图中Model.Id的有效性
你提到用asp-route-id="Model.Id"没效果,首先要确认视图里的Model确实包含正确的ID值。可以在视图里临时加一行调试代码:
<!-- 在链接上方添加这行,查看ID是否正确 --> <p>当前用户ID:@Model.Id</p> <a asp-page="./UserDetails" asp-route-id="@Model.Id">查看用户详情</a>
如果这里显示的ID是0或空,说明传递给视图的Model本身就没有正确的ID——这时候要回头看控制器/页面模型的代码,是不是没有把保存后的用户实体传递给视图,而是传递了原来的输入ViewModel(这类ViewModel通常不会包含数据库生成的ID)。
第三步:避免直接返回View,改用跳转方法
如果在保存用户后直接返回View(比如return View(user)),虽然模型里有ID,但这种方式属于“服务器端渲染”,后续如果刷新页面可能导致重复提交。更规范的做法是用RedirectToAction(MVC)或RedirectToPage(Razor Pages),通过路由参数传递ID,这也能避免一些视图状态的问题。
额外排查点
- ID类型问题:如果你的ID是
Guid类型,确保传递时没有格式错误(EF Core会自动处理,但要确认SaveChanges后Guid已生成)。 - 异步操作未等待:如果用了
SaveChangesAsync(),一定要加await,否则代码会继续执行,此时ID还没被赋值。 - Model绑定问题:如果视图用的是ViewModel,要确保ViewModel包含
Id属性,并且你把保存后的用户ID赋值给了ViewModel的Id字段再传递给视图。
按照这些步骤排查,应该就能解决ID传递为空的问题了!
内容的提问来源于stack exchange,提问作者Doaa Radwan
相关产品推荐
相关产品推荐

