多表关联时ASP.NET的asp-route-id无法传递正确ID
问题排查:WorkView ID在视图中显示错误
模型定义
Users模型
public class Users { [Key] [DisplayName("__ Users UserID __")] public int UserID { get; set; } [StringLength(7)] [DisplayName("User LAN ID")] public ICollection<WorkView>? WorkView { get; set; } }
WorkView模型
public class WorkView { [Key] [DisplayName("** WorkView ID **")] public int ID { get; set; } [DisplayName("** WorkView mainUserID **")] public int? mainUserID{ get; set; } public Users? Users { get; set; } public string? FirstName { get; internal set; } public string? LastName { get; set; } public string? UserName { get; set; } public string? JobTitle { get; set; } public string? OfficeLocation { get; set; } public string? ManagerFirstName { get; set; } public string? ManagerFamilyName { get; set; } public string? Email { get; set; } }
控制器代码
[HttpGet("WorkView/{id}")] //Opening the WorkView Creation public async Task<IActionResult> WorkViewCreate(int? id) { if (id == null || _context.Users == null) { return View(); } var user = await _context.Users.FindAsync(id); if (user == null) { return NotFound(); } var workView = (from w in _context.WorkView join u in _context.Users on w.mainUserID equals u.UserID where (w.mainUserID == id) select new WorkView { ID = w.ID, mainUserID = u.UserID, }).FirstOrDefault(); var workViewTest = _context.WorkView; Console.WriteLine("workView.ID = " + workView.ID); Console.WriteLine("workView.mainUserID = " + workView.mainUserID); return View(workView); }
视图代码
<script src="~/js/workViewScript.js" defer> </script> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <form asp-controller="Home" asp-action="WorkViewedit" asp-route-id="@Model?.OfficeLocation"> <div style="border:ridge;background-color:lightsalmon;"> <label asp-for="mainUserID"></label> <input asp-for="mainUserID" type="text" class="form-control" aria-label="mainUserID" aria-describedby="basic-mainUserID" style="width:auto;" /> </div> <div style="border:ridge;background-color:lightsalmon;"> <label asp-for="ID"></label> <input asp-for="ID" type="text" class="form-control" aria-label="ID" aria-describedby="basic-ID" style="width:auto;" /> </div> <div style="border:ridge;background-color:lightsalmon;"> <label asp-for="mainUserID"></label> <input asp-for="mainUserID" type="text" class="form-control" aria-label="mainUserID" aria-describedby="basic-mainUserID" style="width:auto;" /> </div> <input type="submit" value="submit" /> </form>
问题现象
控制器Console输出确认workView.ID为472,workView.mainUserID为23,但视图中显示的ID却是Users的ID(23),而非正确的WorkView ID,导致无法正常保存数据。
排查与解决
核心原因
查询构造WorkView对象时,仅赋值了ID和mainUserID,但未显式将Users导航属性设为null。ASP.NET MVC的asp-for标签助手绑定ID字段时,会优先遍历导航属性Users中的UserID(二者均为int类型),最终显示的是Users.UserID而非WorkView.ID。
解决步骤
- 修改查询对象初始化,显式设置导航属性为null:
var workView = (from w in _context.WorkView join u in _context.Users on w.mainUserID equals u.UserID where (w.mainUserID == id) select new WorkView { ID = w.ID, mainUserID = u.UserID, Users = null // 新增此行,避免导航属性干扰绑定 }).FirstOrDefault();
- 可选优化:若无需Users的其他数据,可直接查询WorkView,去掉不必要的关联查询:
var workView = await _context.WorkView .FirstOrDefaultAsync(w => w.mainUserID == id);
此写法更简洁,同时避免导航属性自动关联的问题。
- 验证视图绑定:确认视图中
asp-for="ID"绑定的是WorkView模型的ID字段,修改后重新测试,视图将正确显示WorkView的ID(472)。
内容的提问来源于stack exchange,提问作者Hakeem
相关产品推荐
相关产品推荐

