在MVC中创建变量列表模型

时间:2015-05-19 10:07:55

标签: mysql asp.net-mvc

我有下表:

        | Math  | English | Chemistry
John J. |  A    |    F    |     B
Mike M. |  A    |    F    |     B
Eve E.  |  A    |    F    |     B

所以我有一个可变数量的列(可以在运行时设置)和可变数量的学生。

我的SQL DB 可以看起来像:

Table 1
  studentID
  studentName
  studentAddress
Table 2:
  disciplineID
  disciplineName
  disciplineTeacher
Table 3:
  studentID
  disciplineID
  grade

我的模型应该如何?我可以这样做:

public class Catalog
{
    public int ID { get; set; }
    public virtual IEnumerable<Discipline> Disciplines { get; set; }
    public virtual IEnumerable<Student> Students { get; set; }
    public virtual IEnumerable<Grades> StudentGrades { get; set; }
}

internal class Discipline
{
    public int ID { get; set; }
    public string Name { get; set; }
}

internal class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
}

internal class Grades
{
    public int StudentId { get; set; }
    public int DisciplineId { get; set; }
    public char Grade { get; set; }
}

这是执行此多列/运行时定义的常规方法吗? 如何确保视图中的学科始终处于相同的顺序? 如何确保在视图中,当我呈现表格行时,为每个学生显示正确的学科的正确成绩?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

这是执行此多列/运行时定义的常规方法吗?

这不是唯一的方法,但(对我而言)将所有单独的数据传递给视图并让视图对其进行排序似乎没有任何问题。

您可以转换为学生的ILookup - 这会减少视图中的代码。

  

如何确保视图中的规则始终处于相同的顺序?

你还没有包括你迄今为止尝试过的内容。

基本上:遍历每个学生,然后遍历每个学科并找到每个学科的相应成绩 - 如果没有,则显示&#34; - &#34;

类似于:你应该使用@ Html.DisplayFor等

<tbody>
   @foreach(var student in Model.Students)
   {
     <tr>
       <td>@student.Name</td>
       @foreach(var discipline in Model.Disiplines)
       {
          var grade = Model.Grades.Where(
                           x => x.StudentId == student.StudentId 
                                && x.DisciplineId == discipline.DisciplineId)
                            .FirstOrDefault();
          <td>
              @(grade==null ? "-" : grade.Grade)
          </td>
       }
     </tr>
   }