为了能够通过MajorId和GradeId获取对应的班级列表,需要在ClassRepo中添加对应的方法。
新增的GetList方法和基类中的GetList方法不同之处是它接收2个参数,分别是Guid?类型的majorId和gradeId。
Guid代表参数可为空,如果为空,就不去筛选这一项。
要做这件事,需要先通过AsQueryable方法使DbSet支持更复杂的查询。
然后分别判断majorId和gradeId是否为空,如果不为空,则添加Where方法筛选数据。
最后将查询的数据返回。
代码如下:
public List<Class> GetList(Guid? majorId, Guid? gradeId)
{
IQueryable<Class> query = DbSet.AsQueryable();
if (majorId != null)
{
query = query.Where(c => c.MajorId.Equals(majorId));
}
if (gradeId != null)
{
query = query.Where(c => c.GradeId.Equals(gradeId));
}
return query.ToList();
}
在StudentService中添加GetClassSelectModel方法。
GetClassSelectModel方法接收3个参数,分别是classId,majorId,gradeId.
通过GetClassSelectModel方法,可以获取筛选后班级列表。
代码如下:
public StudentViewModel GetClassSelectModel(Guid? classId, Guid? majorId, Guid? gradeId)
{
StudentViewModel model = new StudentViewModel();
List<Class> classes = classRepo.GetList(majorId, gradeId);
model.Classes = new SelectList(classes, "Id", "Name", classId);
return model;
}
其中SelectList的第4个参数表示默认选项,如果班级列表中没有找到默认选项对应的值则默认选择第一个。
在StudentController中创建GetClassSelectPartial动作,参数列表和GetClassSelectModel相同。
和前面的Action不同,GetClassSelectPartial返回的是PartialView,表示返回一个分部视图。
代码如下:
public IActionResult GetClassSelectPartial(Guid? classId, Guid? majorId, Guid? gradeId)
{
return PartialView("ClassSelectPartial", studentService.GetClassSelectModel(classId, majorId, gradeId));
}
其中,PartialView的第一个参数表示返回的分部视图的文件名,第二个参数表示返回的视图模型。
在Views下的Student文件夹中创建一个名为ClassSelectPartial.cshtml的分部视图文件。
分部视图的用法和普通视图类似,可以设置视图模型,区别只是分部视图不和布局文件结合。
由于GetClassSelectPartial返回的视图模型类型是StudentViewModel,因此将视图模型设置为StudentViewModel。
然后在下面添加一个select标签解析班级列表即可。
代码如下:
@model StudentViewModel
<select asp-for="ClassId" asp-items="Model.Classes">
<option value="">请选择</option>
</select>
现专业表中有数据如下:
年级表中有数据如下:
班级表中有数据如下:
可以假设我们要获取2020级软件工程的班级列表,可以在地址栏输入:
/Student/GetClassSelectPartial?majorId=79351D62-661C-42E5-803F-4FEF6F8A5F23&gradeId=6930E40B-519F-43BA-AFFB-F08B2AF0F12D
这样就获得了一个下拉列表。
如果想默认选择其中某一个班级,主需要在后面附加classId的值即可。