如何在Razor页面使用无对应数据库的AcceptedTableViewModel填充表格?
解决方案
AcceptedTableViewModel作为视图模型无需对应数据库表,你需要从关联的PendingModel和AcceptedModel表中查询数据,将结果映射为AcceptedTableViewModel的集合后,再传递给Razor页面使用,具体步骤如下:
1. 配置表关联关系
先在EF Core的DbContext中定义两个表的关联规则(比如一对一/一对多,根据业务逻辑),假设AcceptedModel通过外键PendingId关联PendingModel的主键Id:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<AcceptedModel>() .HasOne<PendingModel>() .WithOne() .HasForeignKey<AcceptedModel>(a => a.PendingId); }
2. 查询并映射为ViewModel集合
在Razor页面的PageModel中,通过LINQ关联两个表的数据,投影生成AcceptedTableViewModel列表:
public class YourRazorPageModel : PageModel { private readonly YourDbContext _dbContext; public YourRazorPageModel(YourDbContext dbContext) { _dbContext = dbContext; } public List<AcceptedTableViewModel> AcceptedRecords { get; set; } public async Task OnGetAsync() { AcceptedRecords = await _dbContext.AcceptedModel .Join( _dbContext.PendingModel, accepted => accepted.PendingId, pending => pending.Id, (accepted, pending) => new AcceptedTableViewModel { // 填充PendingModel字段 fName = pending.fName, lName = pending.lName, Unit = pending.Unit, // 填充AcceptedModel字段 TimeAccepted = accepted.TimeAccepted, TotalVotes = accepted.TotalVotes } ) .ToListAsync(); } }
注:如果你的AcceptedTableViewModel是通过接口继承实现多字段复用,直接对应字段赋值即可;字段较多时可使用AutoMapper简化映射,避免手动编写投影代码。
3. 在Razor页面循环渲染表格
直接绑定PageModel中的AcceptedRecords集合,循环生成表格内容:
<table> <thead> <tr> <th>名</th> <th>姓</th> <th>单位</th> <th>受理时间</th> <th>总票数</th> </tr> </thead> <tbody> @foreach (var record in Model.AcceptedRecords) { <tr> <td>@record.fName</td> <td>@record.lName</td> <td>@record.Unit</td> <td>@record.TimeAccepted</td> <td>@record.TotalVotes</td> </tr> } </tbody> </table>
内容的提问来源于stack exchange,提问作者clickjaw
相关产品推荐
相关产品推荐

