ASP.NET MVC Razor按门店ID关联展示对应书籍数据的实现方案
解决Razor中按门店ID展示对应书籍的问题
1. 确认模型关联配置
先确保Store和Book模型的关联关系定义正确,外键与导航属性缺一不可:
// Store 模型 public class Store { public int Id { get; set; } public string Name { get; set; } // 导航属性:当前门店下的所有书籍 public ICollection<Book> Books { get; set; } = new List<Book>(); } // Book 模型 public class Book { public int Id { get; set; } public string Title { get; set; } // 外键:关联所属门店的ID public int StoreId { get; set; } // 导航属性:所属门店 public Store Store { get; set; } }
2. 仓储层加载关联数据
查询门店时必须通过Include方法加载关联的书籍集合,否则视图无法获取对应数据:
public async Task<IEnumerable<Store>> GetStoresWithBooks() { return await _context.Stores .Include(s => s.Books) // 加载每个门店对应的书籍 .ToListAsync(); }
3. 控制器传递数据到视图
调用仓储方法获取带关联书籍的门店列表,直接传给视图:
public async Task<IActionResult> Index() { var stores = await _storeRepo.GetStoresWithBooks(); return View(stores); }
4. 视图遍历当前门店的书籍集合
这是你之前出错的核心——不要遍历全局书籍列表,而是遍历当前store对象的Books属性:
@model IEnumerable<Store> @foreach (var store in Model) { <div class="store-container"> <h2>@store.Name</h2> <div class="books-section"> <h3>本店书籍:</h3> @if (store.Books.Any()) { <ul> @foreach (var book in store.Books) { <li>@book.Title</li> } </ul> } else { <p>暂无书籍</p> } </div> </div> }
额外注意事项
- 检查数据库中
Book表的StoreId字段,确保每条书籍数据都正确关联到对应的门店ID; - 如果使用EF Core,可在
DbContext的OnModelCreating方法里显式配置关联关系(可选,避免潜在问题):
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Book>() .HasOne(b => b.Store) .WithMany(s => s.Books) .HasForeignKey(b => b.StoreId) .OnDelete(DeleteBehavior.Cascade); }
内容的提问来源于stack exchange,提问作者loooping004
相关产品推荐
相关产品推荐

