feat: 添加学生提交系统功能
Some checks failed
TechAct / explore-gitea-actions (push) Failing after 30s

- 添加学生提交管理服务 (StudentSubmissionService, StudentSubmissionDetailService)
- 新增学生提交相关控制器 (StudentSubmissionController, StudentSubmissionDetailController)
- 添加学生提交数据传输对象 (StudentSubmissionDetailDto, StudentSubmissionSummaryDto)
- 新增学生提交相关页面组件 (StudentExamView, ExamDetailView, StudentCard等)
- 添加学生提交信息卡片组件 (SubmissionInfoCard, TeacherSubmissionInfoCard)
- 更新数据库迁移文件以支持提交系统
This commit is contained in:
SpecialX
2025-09-09 15:42:31 +08:00
parent 6a65281850
commit 439c8a2421
47 changed files with 5486 additions and 119 deletions

View File

@@ -2,7 +2,7 @@
<MudGrid Class="h-100">
<MudItem xs="12" sm="2" Class="h-100 pa-1 mt-1">
<MudItem sm="2" Class="h-100 pa-1 mt-1">
<MudStack Class="h-100">
<MudText Style="color:white"> BETA版本 </MudText>
<MudText Style="color:white" Typo="Typo.h3"><b> 75 </b></MudText>
@@ -44,7 +44,7 @@
</MudItem>
<MudItem xs="12" sm="9">
<MudItem sm="9">
<MudPaper Style="background-color:transparent" Class="w-100 mt-n3" Height="100%" Elevation="0">
<MudChart ChartType="ChartType.Line" Class="pt-0" ChartSeries="@Series" XAxisLabels="@XAxisLabels" CanHideSeries
Height="150px" Width="100%" AxisChartOptions="_axisChartOptions" ChartOptions="options">
@@ -72,12 +72,6 @@
</MudGrid>
</MudPaper>
@* <MudChip Size="Size.Small" Text="pink" Variant="Variant.Text" Color="Color.Secondary">成绩趋势</MudChip>
<MudChip Size="Size.Small" Text="blue" Variant="Variant.Text" Color="Color.Info">分值区间</MudChip>
<MudChip Size="Size.Small" Text="green" Variant="Variant.Text" Color="Color.Success">Success</MudChip>
<MudChip Size="Size.Small" Text="orange" Variant="Variant.Text" Color="Color.Warning">Warning</MudChip>
<MudChip Size="Size.Small" Text="red" Variant="Variant.Text" Color="Color.Error">Error</MudChip>
<MudChip Size="Size.Small" Text="black" Variant="Variant.Text" Color="Color.Dark">Dark</MudChip> *@
@code {
public double[] data = { 25, 77, 28, 5 };

View File

@@ -0,0 +1,191 @@
@using Entities.DTO
@using TechHelper.Client.Services
<MudPaper Class="rounded-xl w-100 px-10 ma-3 pt-5" Elevation="5" Height="170px" Style="background-color:#6bc6be">
<MudGrid Class="h-100">
<MudItem sm="2" Class="h-100 pa-1 mt-1">
<MudStack Class="h-100">
<MudText Style="color:white"> BETA版本 </MudText>
<MudText Style="color:white" Typo="Typo.h3"><b> @StudentSubmissionDetail.AverageScore </b></MudText>
<MudPaper Elevation=0 Class="h-100 w-100" Style="background-color:transparent">
<MudStack Class="h-100" Row=true>
<MudPaper Elevation=0 Height="100%" Width="100%" Style="background-color:transparent">
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
总数:
<span style="color: #fefefe;"> @StudentSubmissionDetail.TotalQuestions </span>
</MudText>
</MudPaper>
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
总分:
<span style="color: #fefefe;"> 150 </span>
</MudText>
</MudPaper>
</MudPaper>
<MudPaper Elevation=0 Height="100%" Width="100%" Style="background-color:transparent">
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
排名:
<span style="color: #fefefe;"> @StudentSubmissionDetail.TotalRank </span>
</MudText>
</MudPaper>
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
平均:
<span style="color: #fefefe;"> @StudentSubmissionDetail.ClassAverageScore </span>
</MudText>
</MudPaper>
</MudPaper>
</MudStack>
</MudPaper>
</MudStack>
</MudItem>
<MudItem sm="9">
<MudPaper Style="background-color:transparent" Class="w-100 mt-n3" Height="100%" Elevation="0">
<MudChart ChartType="ChartType.Line" Class="pt-0" ChartSeries="@Series" XAxisLabels="@XAxisLabels" CanHideSeries
Height="150px" Width="100%" AxisChartOptions="_axisChartOptions" ChartOptions="options">
<CustomGraphics>
<style>
.heavy {
font: normal 12px helvetica;
fill: rgb(255,255,255);
letter-spacing: 2px;
}
</style>
<text x="60" y="15" class="heavy"> 成绩的整体分布情况 </text>
</CustomGraphics>
</MudChart>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="1">
<MudChipSet T="string" SelectedValuesChanged="HandleSelectedValuesChanged" SelectedValues="@_selected" SelectionMode="SelectionMode.MultiSelection" CheckMark="true">
<MudChip Size="Size.Small" Text="类型错误数量分布" Variant="Variant.Text" Color="Color.Default">类型分布</MudChip>
<MudChip Size="Size.Small" Text="类型错误成绩分布" Variant="Variant.Text" Color="Color.Primary">课时分布</MudChip>
</MudChipSet>
</MudItem>
</MudGrid>
</MudPaper>
@* <MudChip Size="Size.Small" Text="pink" Variant="Variant.Text" Color="Color.Secondary">成绩趋势</MudChip>
<MudChip Size="Size.Small" Text="blue" Variant="Variant.Text" Color="Color.Info">分值区间</MudChip>
<MudChip Size="Size.Small" Text="green" Variant="Variant.Text" Color="Color.Success">Success</MudChip>
<MudChip Size="Size.Small" Text="orange" Variant="Variant.Text" Color="Color.Warning">Warning</MudChip>
<MudChip Size="Size.Small" Text="red" Variant="Variant.Text" Color="Color.Error">Error</MudChip>
<MudChip Size="Size.Small" Text="black" Variant="Variant.Text" Color="Color.Dark">Dark</MudChip> *@
@code {
private AxisChartOptions _axisChartOptions = new AxisChartOptions
{
};
private ChartOptions options = new ChartOptions
{
InterpolationOption = InterpolationOption.NaturalSpline,
YAxisFormat = "c2",
ShowLegend = false,
YAxisLines = false,
XAxisLines = false,
XAxisLabelPosition = XAxisLabelPosition.None,
YAxisLabelPosition = YAxisLabelPosition.None,
YAxisTicks = 100,
ShowLabels = false,
ShowLegendLabels = false
};
public List<ChartSeries> Series = new List<ChartSeries>()
{
new ChartSeries() { Name = "类型错误数量分布", Data = new double[] { 35, 41, 35, 51, 49, 62, 69, 91, 148 } },
};
public string[] XAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep" };
Random random = new Random();
protected override void OnInitialized()
{
options.InterpolationOption = InterpolationOption.NaturalSpline;
options.YAxisFormat = "c2";
options.ShowLegend = false;
options.YAxisLines = false;
options.XAxisLines = false;
options.XAxisLabelPosition = XAxisLabelPosition.None;
options.YAxisLabelPosition = YAxisLabelPosition.None;
options.ShowLabels = false;
options.ShowLegendLabels = false;
options.LineStrokeWidth = 1;
_axisChartOptions.MatchBoundsToSize = true;
Series[0].LineDisplayType = LineDisplayType.Area;
}
[Parameter]
public Guid SubmissionID { get; set; } = Guid.Empty;
private StudentSubmissionDetailDto StudentSubmissionDetail { get; set; } = new StudentSubmissionDetailDto();
private IReadOnlyCollection<string> _selected;
#pragma warning restore 1998
#nullable restore
#line (82, 8) - (143, 1) "D:\AllWX\AllC\TechHelper\TechHelper.Client\Pages\Common\Exam\SubmissionInfoCard.razor"
[Inject]
public IStudentSubmissionDetailService StudentSubmissionDetailService { get; set; }
[Inject]
public ISnackbar Snackbar { get; set; }
protected override async Task OnInitializedAsync()
{
if (SubmissionID != Guid.Empty)
{
StudentSubmissionDetailDto result;
try
{
result = await StudentSubmissionDetailService.GetSubmissionDetailAsync(SubmissionID);
if (result != null)
{
StudentSubmissionDetail = result;
XAxisLabels = result.ErrorTypeDistribution.Keys.ToArray();
Series.Clear();
Series.Add(new ChartSeries
{
Name = "类型错误数量分布",
Data = result.ErrorTypeDistribution.Values.Select(d => (double)d).ToArray()
});
Series.Add(new ChartSeries
{
Name = "类型错误成绩分布",
Data = result.ErrorTypeScoreDistribution.Values.Select(d => (double)d).ToArray()
});
}
}
catch (Exception ex)
{
Snackbar.Add($"获取提交错误, 请重试, {ex.Message}", Severity.Warning);
}
}
}
private void HandleSelectedValuesChanged(IReadOnlyCollection<string> selected)
{
Series.ForEach(x => x.Visible = false);
foreach (var item in selected)
{
var sv = Series.FirstOrDefault(predicate: x => x.Name == item);
if (sv != null)
{
sv.Visible = true;
}
}
}
}

View File

@@ -0,0 +1,143 @@
<MudPaper Class="rounded-xl w-100 px-10 ma-3 pt-5" Elevation="5" Height="170px" Style="background-color:#6bc6be">
<MudGrid Class="h-100">
<MudItem xs="12" sm="2" Class="h-100 pa-1 mt-1">
<MudStack Class="h-100">
<MudText Style="color:white"> BETA版本 </MudText>
<MudText Style="color:white" Typo="Typo.h3"><b> 75 </b></MudText>
<MudPaper Elevation=0 Class="h-100 w-100" Style="background-color:transparent">
<MudStack Class="h-100" Row=true>
<MudPaper Elevation=0 Height="100%" Width="100%" Style="background-color:transparent">
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
总数:
<span style="color: #fefefe;">15</span>
</MudText>
</MudPaper>
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
总分:
<span style="color: #fefefe;">15</span>
</MudText>
</MudPaper>
</MudPaper>
<MudPaper Elevation=0 Height="100%" Width="100%" Style="background-color:transparent">
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
中位:
<span style="color: #fefefe;">15</span>
</MudText>
</MudPaper>
<MudPaper Elevation=0 Height="50%" Style="background-color:transparent">
<MudText Style="color:#9ed5f7" Typo="Typo.body2">
方差:
<span style="color: #fefefe;">15</span>
</MudText>
</MudPaper>
</MudPaper>
</MudStack>
</MudPaper>
</MudStack>
</MudItem>
<MudItem xs="12" sm="9">
<MudPaper Style="background-color:transparent" Class="w-100 mt-n3" Height="100%" Elevation="0">
<MudChart ChartType="ChartType.Line" Class="pt-0" ChartSeries="@Series" XAxisLabels="@XAxisLabels" CanHideSeries
Height="150px" Width="100%" AxisChartOptions="_axisChartOptions" ChartOptions="options">
<CustomGraphics>
<style>
.heavy {
font: normal 12px helvetica;
fill: rgb(255,255,255);
letter-spacing: 2px;
}
</style>
<text x="60" y="15" class="heavy"> 成绩的整体分布情况 </text>
</CustomGraphics>
</MudChart>
</MudPaper>
</MudItem>
<MudItem xs="12" sm="1">
<MudChipSet T="string" SelectedValuesChanged="HandleSelectedValuesChanged" SelectedValues="@_selected" SelectionMode="SelectionMode.MultiSelection" CheckMark="true">
<MudChip Size="Size.Small" Text="类型错误数量分布" Variant="Variant.Text" Color="Color.Default">类型分布</MudChip>
<MudChip Size="Size.Small" Text="类型错误成绩分布" Variant="Variant.Text" Color="Color.Primary">课时分布</MudChip>
</MudChipSet>
</MudItem>
</MudGrid>
</MudPaper>
@* <MudChip Size="Size.Small" Text="pink" Variant="Variant.Text" Color="Color.Secondary">成绩趋势</MudChip>
<MudChip Size="Size.Small" Text="blue" Variant="Variant.Text" Color="Color.Info">分值区间</MudChip>
<MudChip Size="Size.Small" Text="green" Variant="Variant.Text" Color="Color.Success">Success</MudChip>
<MudChip Size="Size.Small" Text="orange" Variant="Variant.Text" Color="Color.Warning">Warning</MudChip>
<MudChip Size="Size.Small" Text="red" Variant="Variant.Text" Color="Color.Error">Error</MudChip>
<MudChip Size="Size.Small" Text="black" Variant="Variant.Text" Color="Color.Dark">Dark</MudChip> *@
@code {
public double[] data = { 25, 77, 28, 5 };
public string[] labels = { "Oil", "Coal", "Gas", "Biomass" };
private AxisChartOptions _axisChartOptions = new AxisChartOptions
{
};
private ChartOptions options = new ChartOptions
{
InterpolationOption = InterpolationOption.NaturalSpline,
YAxisFormat = "c2",
ShowLegend = false,
YAxisLines = false,
XAxisLines = false,
XAxisLabelPosition = XAxisLabelPosition.None,
YAxisLabelPosition = YAxisLabelPosition.None,
YAxisTicks = 100,
ShowLabels = false,
ShowLegendLabels = false
};
public List<ChartSeries> Series = new List<ChartSeries>()
{
new ChartSeries() { Name = "类型错误数量分布", Data = new double[] { 35, 41, 35, 51, 49, 62, 69, 91, 148 } },
new ChartSeries() { Name = "类型错误成绩分布", Data = new double[] { 55, 21, 45, 11, 45, 23, 11, 56, 13 } },
};
public string[] XAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep" };
Random random = new Random();
protected override void OnInitialized()
{
options.InterpolationOption = InterpolationOption.NaturalSpline;
options.YAxisFormat = "c2";
options.ShowLegend = false;
options.YAxisLines = false;
options.XAxisLines = false;
options.XAxisLabelPosition = XAxisLabelPosition.None;
options.YAxisLabelPosition = YAxisLabelPosition.None;
options.ShowLabels = false;
options.ShowLegendLabels = false;
options.LineStrokeWidth = 1;
_axisChartOptions.MatchBoundsToSize = true;
Series[0].LineDisplayType = LineDisplayType.Area;
}
private IReadOnlyCollection<string> _selected;
private void HandleSelectedValuesChanged(IReadOnlyCollection<string> selected)
{
Series.ForEach(x => x.Visible = false);
foreach(var item in selected)
{
var sv = Series.FirstOrDefault(predicate: x => x.Name == item);
if(sv != null)
{
sv.Visible = true;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<MudPaper>
<MudText> ExamName </MudText>
<MudText> 已经指派人数 </MudText>
<MudText> 总人数 </MudText>
<MudText> 平均S </MudText>
<MudText> 指派 </MudText>
</MudPaper>

View File

@@ -21,8 +21,6 @@ else
<MudPaper Class="d-flex flex-wrap flex-grow-0 gap-4" Height="100%" Width="100%">
@foreach (var item in examDtos)
{
@* <ExamPreview AssignmentDto="item" Width="256px" Height="256px"> </ExamPreview> *@
<AssignmentInfoCard></AssignmentInfoCard>
}
</MudPaper>

View File

@@ -1,7 +1,34 @@
@page "/exam"
@using TechHelper.Client.Pages.Student.BaseInfoCard
@inject NavigationManager NavigationManager
<AuthorizeView Roles="Teacher">
<Authorized>
<MudPaper Class="rounded-xl ma-2 px-2 overflow-auto w-100 h-100">
<StudentSubmissionPreviewTableCard />
</MudPaper>
</Authorized>
</AuthorizeView>
<MudText>HELLO WORLD</MudText>
<AuthorizeView Roles="Student">
<Authorized>
<MudPaper Class="rounded-xl ma-2 px-2 overflow-auto w-100 h-100">
<StudentSubmissionPreviewTableCard />
</MudPaper>
</Authorized>
</AuthorizeView>
@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected override void OnParametersSet()
{
if (authenticationStateTask is null)
{
NavigationManager.Refresh(forceReload: true);
}
}
}

View File

@@ -0,0 +1,4 @@

@code {
}

View File

@@ -7,7 +7,6 @@
<TechHelper.Client.Pages.Student.HomePage />
</Authorized>
</AuthorizeView>
@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }

View File

@@ -1,39 +1,97 @@
<MudPaper Class="ma-2 pa-2 rounded-xl d-flex flex-column flex-grow-1 overflow-auto" MaxHeight="100%">
@using TechHelper.Client.Services
@inject IStudentSubmissionService StudentSubmissionService
<MudPaper Class="ma-2 pa-2 rounded-xl d-flex flex-column flex-grow-1 overflow-auto" MaxHeight="100%">
<StudentSubmissionPreviewCard />
@foreach (var submission in _studentSubmissions)
@if (_isLoading)
{
<StudentSubmissionPreviewCard StudentSubmission="@submission" />
<div class="d-flex justify-content-center align-items-center" style="height: 200px;">
<MudProgressCircular Color="Color.Primary" Size="Size.Large" />
</div>
}
else if (_studentSubmissions == null || _studentSubmissions.Count == 0)
{
<div class="d-flex justify-content-center align-items-center" style="height: 200px;">
<MudText TextColor="Color.TextSecondary" Align="Align.Center">暂无提交记录</MudText>
</div>
}
else
{
@foreach (var submission in _studentSubmissions)
{
<StudentSubmissionPreviewCard StudentSubmission="@submission" />
}
}
</MudPaper>
@code {
// 假设的学生提交数据模型
// 学生提交数据模型
public class StudentSubmission
{
public string StudentName { get; set; }
public int TotalProblems { get; set; }
public int ErrorCount { get; set; }
public DateTime CreatedDate { get; set; }
public float Score { get; set; }
public string AssignmentName { get; set; }
public string Status { get; set; }
public TimeSpan TimeSpent { get; set; }
public int Score { get; set; }
}
// 模拟数据列表
// 学生提交列表
private List<StudentSubmission> _studentSubmissions = new();
private bool _isLoading = true;
protected override void OnInitialized()
protected override async Task OnInitializedAsync()
{
// 模拟获取或初始化数据实际应用中可能来自数据库或API
_studentSubmissions = new List<StudentSubmission>
{
new() { StudentName = "张三", TotalProblems = 10, ErrorCount = 2, TimeSpent = TimeSpan.FromMinutes(25), Score = 80 },
new() { StudentName = "李四", TotalProblems = 10, ErrorCount = 1, TimeSpent = TimeSpan.FromMinutes(20), Score = 90 },
new() { StudentName = "王五", TotalProblems = 10, ErrorCount = 5, TimeSpent = TimeSpan.FromMinutes(30), Score = 50 },
new() { StudentName = "赵六", TotalProblems = 10, ErrorCount = 3, TimeSpent = TimeSpan.FromMinutes(28), Score = 70 },
new() { StudentName = "钱七", TotalProblems = 10, ErrorCount = 0, TimeSpent = TimeSpan.FromMinutes(18), Score = 100 }
// ... 可以添加更多模拟数据
};
await LoadStudentSubmissions();
}
}
private async Task LoadStudentSubmissions()
{
try
{
_isLoading = true;
StateHasChanged();
var result = await StudentSubmissionService.GetMySubmissionsAsync();
if (result.Status && result.Result != null)
{
// 从服务器获取的数据映射到我们的模型
var submissions = result.Result as List<Entities.DTO.StudentSubmissionSummaryDto>;
if (submissions != null)
{
_studentSubmissions = submissions.Select(submission => new StudentSubmission
{
AssignmentName = submission.AssignmentName,
CreatedDate = submission.CreatedDate,
ErrorCount = submission.ErrorCount,
Score = submission.Score,
StudentName = submission.StudentName,
Status = submission.Status,
TotalProblems = submission.TotalQuestions,
TimeSpent = TimeSpan.FromMinutes(30) // 默认值,实际应用中可以从服务器获取
}).ToList();
}
}
else
{
// 如果API调用失败使用空列表
_studentSubmissions = new List<StudentSubmission>();
}
}
catch (Exception ex)
{
// 处理异常,可以记录日志
_studentSubmissions = new List<StudentSubmission>();
}
finally
{
_isLoading = false;
StateHasChanged();
}
}
}

View File

@@ -2,10 +2,10 @@
@using TechHelper.Client.Pages.Student.BaseInfoCard;
@using TechHelper.Client.Pages.Common;
<MudPaper Class="w-100 h-100 d-flex flex-row">
<MudPaper Class="flex-grow-1 mx-2 d-flex flex-column">
<AssignmentInfoCard></AssignmentInfoCard>
<MudPaper Class="d-flex flex-row">
<MudPaper Class="w-100 h-100 d-flex flex-row" Style="background-color: transparent" Elevation="0">
<MudPaper Class="flex-grow-1 mx-2 d-flex flex-column" Style="background-color:transparent" Elevation="0">
<SubmissionInfoCard ></SubmissionInfoCard>
<MudPaper Class="d-flex flex-row" Style="background-color:transparent" Elevation="0">
<NotifyCard></NotifyCard>
<HomeworkCard></HomeworkCard>
<NotifyCard></NotifyCard>
@@ -13,7 +13,7 @@
</MudPaper>
<StudentSubmissionPreviewTableCard></StudentSubmissionPreviewTableCard>
</MudPaper>
<MudPaper Width="300px" Class="mx-2 align-content-center d-flex flex-column flex-grow-1">
<MudPaper Width="300px" Class="mx-2 align-content-center d-flex flex-column flex-grow-1" Style="background-color: transparent" Elevation="0">
<HeadIconCard></HeadIconCard>
<TotalErrorQuestionType></TotalErrorQuestionType>
@@ -22,42 +22,4 @@
@code {
public double[] data = { 25, 77, 28, 5 };
public string[] labels = { "Oil", "Coal", "Gas", "Biomass" };
private AxisChartOptions _axisChartOptions = new AxisChartOptions();
private ChartOptions options = new ChartOptions();
public List<ChartSeries> Series = new List<ChartSeries>()
{
new ChartSeries() { Name = "Series 1", Data = new double[] { 90, 79, 72, 69, 62, 62, 55, 65, 70 } },
new ChartSeries() { Name = "Series 2", Data = new double[] { 35, 41, 35, 51, 49, 62, 69, 91, 148 } },
};
public string[] XAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep" };
Random random = new Random();
protected override void OnInitialized()
{
options.InterpolationOption = InterpolationOption.NaturalSpline;
options.YAxisFormat = "c2";
_axisChartOptions.MatchBoundsToSize = true;
}
public void RandomizeData()
{
foreach (var series in Series)
{
for (int i = 0; i < series.Data.Length - 1; i++)
{
series.Data[i] = random.NextDouble() * 100 + 10;
}
}
StateHasChanged();
}
void OnClickMenu(InterpolationOption interpolationOption)
{
options.InterpolationOption = interpolationOption;
StateHasChanged();
}
}

View File

@@ -0,0 +1,3 @@
<MudPaper>
<MudText> EXAM NAME</MudText>
</MudPaper>

View File

@@ -0,0 +1,7 @@
@using Entities.DTO
<h3>StudentCard</h3>
@code {
[Parameter]
public StudentDto StudentDto{ get; set; }
}

View File

@@ -6,7 +6,9 @@
@foreach(var cs in ClassStudents)
{
<MudText> @cs.DisplayName </MudText>
<StudentCard StudentDto="@cs">
</StudentCard>
}