分部视图

为了能够通过MajorId和GradeId获取对应的班级列表,需要在ClassRepo中添加对应的方法。

添加GetList方法

新增的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();
}

添加GetClassSelectModel方法

在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个参数表示默认选项,如果班级列表中没有找到默认选项对应的值则默认选择第一个。

创建GetClassSelectPartial动作

在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>

测试

现专业表中有数据如下:

image-20240818175052630

年级表中有数据如下:

image-20240818175230762

班级表中有数据如下:

image-20240818175515437

可以假设我们要获取2020级软件工程的班级列表,可以在地址栏输入:

/Student/GetClassSelectPartial?majorId=79351D62-661C-42E5-803F-4FEF6F8A5F23&gradeId=6930E40B-519F-43BA-AFFB-F08B2AF0F12D

这样就获得了一个下拉列表。

image-20240818175814959

如果想默认选择其中某一个班级,主需要在后面附加classId的值即可。