你如何使一个课堂展示的“考勤表”用适当的布局?(How do you make an 'at

2019-07-29 08:50发布

我一直有一个艰难的时间越来越要显示以适当的方式课堂出勤表。 我在我的数据库中的表出席,我可以得到只从一个教室要显示的数据很容易,但它显示,看起来就像如果你在数据库中浏览到考勤表直接将如何看待的方式。

这可能是通过展示我的工作更容易为我解释一下:

我有以下类别:

实际的课堂教学班,或课程:

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public int AttendanceDate { get; set;}
    public virtual ICollection<Enrollment> Enrollments { get; set; } // allows Students to be enrolled in a Course
    etc. . .
}

我的学生们:

public class Student
{
    public int StudentID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; } // allows Student to be enrolled in a Course
    etc. . .
}

是关系学生的课程实体:

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

考勤数据:

public class Attendance
{
    public int AttendanceID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public int AttendanceDay { get; set; }  // used to set how many days people are supposed to attend this Course (each course has a different length, some are 10 day courses, some are 3, etc.)
    public bool Present { get; set; }  // absent or present (set to absent by default)
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

我的项目的流动具有教师创建课程的学生报名参加。 当学生对课程的迹象时,所有必要的考勤数据输入到使用默认值(缺席每天)考勤数据库表:

for (int i = 0; i < course.AttendingDays; i++)
{
    Attendance newAttendance = new Attendance
    {
        CourseID = course.CourseID,
        StudentID = thisStudent.StudentID,
        AttendanceDay = i + 1,
        Present = false
    };
    db.Attendance.Add(newAttendance);
    db.Save();
}

所以,我有一堆考勤数据的数据库表,我不能让它在屏幕上正确显示,排序与此类似:

出席第1天| 2 | 3 | 4 | 5 |

Student1无无无无无

STUDENT2无无无无无

学生三无无无无无

希望你可以阅读。 。 。 我想这是一个考勤表相当标准的布局。

我曾尝试与排序分组依据的数据:

var model = from s in db.Attendance
                             where s.CourseID == 4
                             group s.AttendanceDay by s.StudentID into t
                             select new
                             {
                                 StudentID = t.Key,
                                 Days = t.OrderBy(x => x)
                             };
        return View(model);

返回匿名类型的IEnumerable(如果我理解正确的),但我似乎无法得到这个数据做任何事情。 如果我使用“简单”台发电机(不要试图集团通过AttendanceDay号)我得到的考勤表数据就好了,但它的排序,就像它是当你查看实际的数据库表出席,不是很有用的,如果你想要一个教师阅读和编辑信息。

我想我需要一个适当的视图模型来调整匿名类型格式的IEnumerable的传入考勤数据,其次是适当地显示该视图模型的图。 。 。 但我不知道我将如何处理这一进程。

任何帮助,将不胜感激。 谢谢。

更新:

我开始想我需要采取“交叉报表” /“旋转”的优势,使用这样的: http://linqlib.codeplex.com/wikipage?title=Pivot&referringTitle=Home

任何指针?

更新2:

使用下面的接受的答案几乎完全解决了,这里是我的电流控制器:

        // Generates list of Attendances specifically for current Course
        var attendanceItems = db.Attendance.Where(s => s.CourseID == id);
        List<Attendance> attendanceItemsList = attendanceItems.ToList();
        // End of generating list of Attendances


        // CURRENT PROBLEM AREA - INCOMPLETE
        var student = attendanceItemsList.Select(a => a.Student).Distinct()/*.OrderBy(a => a)*/;  // This works for adding one student, Cannot use OrderBy in its current state - how can I properly order by name?  (right now it will order by id I believe)
        List<Student> StudentList = student.ToList();;

        //
        // Generates list of AttendingDays specifically for current Course
        Course course = db.Courses.FirstOrDefault(p => p.CourseID == id);
        List<int> attDayList = new List<int>();
        for (int i = 0; i < course.AttendingDays; i++)
        {
            attDayList.Add(i + 1);
        };
        // End of generating list of AttendingDays

        AttendanceReportViewModel model = new AttendanceReportViewModel
        {
            AttendanceDays = attDayList,
            Students = StudentList,
            Attendances = attendanceItemsList,
        };
        return View(model);

Answer 1:

我想你应该考虑创建一个包含天列表的视图模型,学生名单,并出席条目的列表,然后简单地遍历在出勤天数的学生中,然后显示每个考勤记录。

因此,视图模型会是这个样子:


public class AttendanceReportViewModel
{
    public List<int> AttendanceDays { get; set; }
    public List<Student> Students { get; set; }
    public List<Attendance> Attendances { get; set; }

    public string IsPresent(Student student, int attendanceDay)
    {
         return Attendances.Single(a => a.StudentID == student.ID && a.AttendanceDay == attendanceDay).Present ? "present" : "absent";
    }
}

确保所有的项目,你希望他们出现的方式进行排序,但这是简单的排序依据的东西。 另外,还要确保只负载出席有问题的课程和任何课程数据添加到你想显示视图模型。

然后在您的视图迭代,如下所示:


<table>
    <thead>
        <tr>
            <th>Attendance Day</th>
            @foreach (var attendanceDay in Model.AttendanceDays)
            {
                <th>@attendanceDay</th>
            }
        </tr>
    <thead>
    <tbody>
        @foreach (var student in Model.Students)
        {
            <tr>
                <td>@student.Name</td>
                @foreach (var attendanceDay in Model.AttendanceDays)
                {
                    <td>@Model.IsPresent(student, attendanceDay)</td>
                }
            </tr>
        }
    </tbody>
}

就在这个疲惫不堪一起给你,所以如果不是我的确切代码编译,甚至肯定的,但我希望它给你一个很好的起点。 显然,一些造型表等应适用。

编辑1:

将数据加载到视图模型,你可以只是这样做的控制器(最终这应该从技术上来讲是仓库,甚至一个服务层)


var viewModel = new AttendanceReportViewModel();

viewModel.AttendanceDays = db.Attendance.Select(a => a.AttendanceDay).Distinct().OrderBy(a => a)
...

我还应该指出的是,当然你也可以只加载了考勤数据只到视图模型,然后从这个数据产生的视图模型的AttendanceDays和学生的属性。 我避开这个现在,你很可能想学生数据,以及。

编辑2

对于学生而言,只是更多您想报名参加了班上所有的学生一样,但是既然你已经为所有的日子在前面你可以做这个初始化考勤数据:


var viewModel = new AttendanceReportViewModel();

viewModel.AttendanceDays = db.Attendance.Select(a => a.AttendanceDay).Distinct().OrderBy(a => a);
viewModel.Students = db.Attendance.Select(a => a.Student).Distinct().OrderBy(s => s.Name);

另外,您可以只加载从像这样的招生表这样的信息:


viewModel.Students = db.Enrollment.Where(e => e.CourseID == courseID).Select(e => e.Student).OrderBy(s => s.Name);

请注意,我相信,有在桌子招生课程和学生证之间的唯一约束和courseID是你生产的出席报告。 你也有课程映射到以上的学生,我会假设是不正确的报名表。



文章来源: How do you make an 'attendance table' for a classroom display with an appropriate layout?