ASP.NET MVC多字段共用下拉列表时Details.cshtml无法正确显示人员信息
解决方法
1. 修正实体模型配置
你的主实体(替换为实际类名)目前仅定义了一个LocalResname导航属性,但需要两个独立导航属性分别对应ChiefInvestigatorID和PrincipalInvestID。修改实体类:
public class YourMainEntity // 替换为你的实际实体类名 { // 原有属性保留... public int? ChiefInvestigatorID { get; set; } public int? PrincipalInvestID { get; set; } // 添加两个独立导航属性并指定外键 [ForeignKey("ChiefInvestigatorID")] public LocalResname ChiefInvestigator { get; set; } [ForeignKey("PrincipalInvestID")] public LocalResname PrincipalInvestigator { get; set; } }
若使用Fluent API配置(更推荐),在DbContext的OnModelCreating方法中添加:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<YourMainEntity>() .HasOne(x => x.ChiefInvestigator) .WithMany() .HasForeignKey(x => x.ChiefInvestigatorID) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity<YourMainEntity>() .HasOne(x => x.PrincipalInvestigator) .WithMany() .HasForeignKey(x => x.PrincipalInvestID) .OnDelete(DeleteBehavior.Restrict); }
2. 修改Details控制器方法,加载双关联实体
在控制器的Details方法中,同时Include两个导航属性确保数据正确加载:
public async Task<IActionResult> Details(int? id) { if (id == null || _context.YourMainEntity == null) { return NotFound(); } var entity = await _context.YourMainEntity .Include(x => x.ChiefInvestigator) .Include(x => x.PrincipalInvestigator) .FirstOrDefaultAsync(m => m.Id == id); // 替换为你的主键字段 if (entity == null) { return NotFound(); } return View(entity); }
3. 更新Details.cshtml视图,分别显示两个人员信息
首席调查员区域:
<div class="row"> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.ChiefInvestigatorID) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.ChiefInvestigatorID) </div> </div> </div> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.ChiefInvestigator.Title) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.ChiefInvestigator.Title) </div> </div> </div> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.ChiefInvestigator.Forename) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.ChiefInvestigator.Forename) </div> </div> </div> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.ChiefInvestigator.Surname) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.ChiefInvestigator.Surname) </div> </div> </div> </div>
主要调查员区域:
<div class="row mt-3"> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.PrincipalInvestID) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.PrincipalInvestID) </div> </div> </div> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.PrincipalInvestigator.Title) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.PrincipalInvestigator.Title) </div> </div> </div> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.PrincipalInvestigator.Forename) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.PrincipalInvestigator.Forename) </div> </div> </div> <div class="col-sm-2"> <div class="form-group"> <br /> <b> @Html.DisplayNameFor(model => model.PrincipalInvestigator.Surname) </b> <div class="col-sm-10"> @Html.DisplayFor(model => model.PrincipalInvestigator.Surname) </div> </div> </div> </div>
问题根源
之前的模型仅绑定了一个LocalResname导航属性,EF会自动匹配单一外键关联,导致两个字段共用同一人员数据。添加双导航属性并配置对应外键后,EF可正确区分两个关联关系,加载各自对应的人员信息。
内容的提问来源于stack exchange,提问作者Sally Parkes
相关产品推荐
相关产品推荐

