首先,我们需要定义一对多关系的ViewModel。假设我们有一个学校,一个学校可以有多个班级,每个班级又可以有多个学生。我们可以定义以下ViewModel:
public class SchoolViewModel{
public int SchoolId { get; set; }
public string Name { get; set; }
public List Classes { get; set; }
}
public class ClassViewModel{
public int ClassId { get; set; }
public string Name { get; set; }
public List Students { get; set; }
}
public class StudentViewModel{
public int StudentId { get; set; }
public string Name { get; set; }
}
接下来,我们可以创建包含一些基本操作的控制器,如下所示:
public class SchoolController : Controller{
private readonly ApplicationDbContext _context;
public SchoolController(ApplicationDbContext context){
_context = context;
}
public IActionResult Index(){
List schools = new List();
foreach (var school in _context.Schools){
var classes = _context.Classes.Where(c => c.SchoolId == school.SchoolId)
.Select(c => new ClassViewModel{
ClassId = c.ClassId,
Name = c.Name,
Students = _context.Students.Where(s => s.ClassId == c.ClassId)
.Select(s => new StudentViewModel{
StudentId = s.StudentId,
Name = s.Name
})
.ToList()
})
.ToList();
schools.Add(new SchoolViewModel{
SchoolId = school.SchoolId,
Name = school.Name,
Classes = classes
});
}
return View(schools);
}
public IActionResult Create(){
return View();
}
[HttpPost]
public async Task Create(SchoolViewModel schoolViewModel){
if (ModelState.IsValid){
School school = new School{
Name = schoolViewModel.Name
};
_context.Schools.Add(school);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(schoolViewModel);
}
public async Task Edit(int id){
var school = await _context.Schools.FindAsync(id);
if (school == null){
return NotFound();
}
SchoolViewModel schoolViewModel = new SchoolViewModel{
SchoolId = school.SchoolId,
Name = school.Name,
Classes = _context.Classes.Where(c => c.SchoolId == school.SchoolId)
.Select(c => new ClassViewModel{
ClassId = c.ClassId,
Name = c