在 ASP.NET 和实体框架中,用户和教室之间存在多对多关系。我正在尝试获取班级中的学生名单。到目前为止,我知道 2 个解决方案:创建用户/类视图模型,或在控制器和视图之间传递
ViewBag.ClassId
。
有没有办法让查看页面使用
@model IEnumerable<Models.User>
从
Model.Class
获取信息而不创建新的视图模型?
我习惯了 java jsp,我可以在其中传递任何类型的变量,所以我对这种视图/模型限制很陌生。
(用户和类模型是从数据库中构建的,其中“userclass”表作为连接表)。
到目前为止,我只是将
viewbag.classId
传递给每个控制器并将其作为参数:
public async Task<IActionResult> ClassStudents(int id)
{
var usersInClass = await _context.Classes
.Where(cls => cls.Id == id)
.Include(cls => cls.Users) // Eager loading to load associated users
.Select(cls => cls.Users.Where(user => user.RoleSettingId == 5))
.FirstOrDefaultAsync();
ViewBag.ClassId = id;
return View("/Views/Classroom/ClassStudents.cshtml", usersInClass);
}
由于 User 和 Classroom 类已经配置了多对多关系,因此您可以使用导航属性来显示 Model.User 中的类信息。
请参考以下示例:
我的模特:
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public IList<Classroom> Classrooms { get; set; } = new List<Classroom>();
}
public class Classroom
{
[Key]
public int CID { get; set; }
public string CName { get; set; }
public IList<User> User { get; set; } = new List<User>();
}
我的数据库上下文:
public SchoolDbcontext(DbContextOptions<SchoolDbcontext> options)
: base(options) { }
public DbSet<User> User { get; set; }
public DbSet<Classroom> Classrooms { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Classroom>().HasMany(x => x.User).WithMany(st => st.Classrooms);
}
控制器:
public async Task<IActionResult> ClassStudentsAsync(int id)
{
var classnum = _context.Classrooms.Include(x=>x.User).FirstOrDefault(cls => cls.CID == id);
var stu = new List<User>();
for (var i = 0; i < classnum.User.Count; i++)
{
var students = classnum.User[i];
stu.Add(students);
}
return View(stu);
}
我的 CSHTML:
@using WebApplication1.Models
@model IEnumerable<WebApplication1.Models.User>
<h1>Student List</h1>
<table>
<thead>
<tr>
<th>Student ID</th>
<th>Name</th>
<th>ClassName</th>
</tr>
</thead>
<tbody>
@foreach (var user in Model)
{
<tr>
<td>@user.ID</td>
<td>@user.Name</td>
<td>@user.Classrooms.FirstOrDefault().CName</td>
</tr>
}
</tbody>
</table>
当我给出班级ID时:2
另外,关于查询语句,可以查看如下语句: 结果是用户列表。
在我的示例代码中,User 和 ClassRooms 配置为多对多关系,UserClass 是联接表。
var userlist = _dbContext.ClassRooms.Where(c => c.ClassID == id)
.Include(cls => cls.UserClass.Where(c => c.ClassId == id)) // Eager loading to load associated users
.ThenInclude(uc => uc.User)
.SelectMany(cls => cls.UserClass.Select(c=>c.User)).ToList();
var userlist2 = _dbContext.User.Include(u => u.UserClass.Where(c=>c.ClassId == id)).ThenInclude(c=>c.ClassRoomes).Where(cls => cls.UserClass.Any(c => c.ClassId == id)).ToList();
致以诚挚的问候,
Dlankd