在视图中显示列表MVC 4

问题描述:

我有一个示范课程,模型组件和模型评价:在视图中显示列表MVC 4

public class Course 
{ 
    public virtual int CourseId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual List<Component> Components { get; set; } 
    public virtual List<UserProfile> Users { get; set; } 
    public virtual List<Evaluation> Evaluation { get; set; } 
} 

public class Component 
{ 
    public virtual int ComponentId { get; set; } 
    public virtual int CourseId { get; set; } 
    public virtual Course Course { get; set; } 
    public virtual string NameComp { get; set; } 
} 

public class Evaluation 
{ 

    public virtual int EvaluationId { get; set; } 

    public virtual int CourseId { get; set; } 
    public virtual Course Course { get; set; } 

    public virtual int UserId { get; set; } 
    public virtual UserProfile User { get; set; } 

    public virtual int Grade { get; set; } 
} 

我需要在一个视图中显示所有用户的表,所有的组件创建和每个人的等级。 我试着这样说:

@model SGP.Models.Course 

<table> 
<tr> 
    <th> 
     Username 
    </th> 
    @foreach (var x in Model.Components) 
    { 
     <th> 
      @Html.DisplayFor(modelItem => x.NameComp) 
     </th> 
    } 
    <th></th> 
</tr> 

@foreach (var item in Model.Evaluation) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.User.UserName) 
     </td> 
     @foreach (var x in Model.Components) 
     { 

      <td> 
       @Html.DisplayFor(modelItem => item.Grade) 
      </td> 
     } 
     <td> 

     </td> 
    </tr> 
} 

但是这给了我所有的部件在一列中,我需要为每个组件一列,并为每一个等级:

代码我有给这个:

Username - Component1Component2Component3 
    Test -    12 
    Test -    13 
    Test -    10 
(example of result with username and grades) 

,我需要:

Username - Component1 - Component2 - Component3 
    Test - 12  - 13  - 10 
(example of result with username and grades) 

我该怎么做?由于

+0

模型看起来不正确。理想情况下,评估应该由UserId分组。它应该是IGrouping 评估或列表 >>评估。 – vijayst

在课程评价的定义应该是:

public virtual IGrouping<string, Evaluation> Evaluations { get; set; } 

的代码应该是:

@model SGP.Models.Course 

<table> 
<tr> 
    <th> 
     Username 
    </th> 
    <th> 
    @foreach (var x in Model.Components) 
    { 
     @Html.DisplayFor(modelItem => x.NameComp) 
    } 
    </th> 
    <th></th> 
</tr> 
@foreach (var group in Model.Evaluations) 
{ 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => group.Key) 
    </td> 
    @foreach (var item in group) 
    { 
     <td> 
      @Html.DisplayFor(modelItem => item.Grade) 
     </td> 
    } 
    <td> 
    </td> 
} 
</tr> 
+0

它在@foreach(组中的var项)中给出一个错误:“foreach语句不能对'SGP.Models.Evaluation'类型的变量进行操作,因为'SGP.Models.Evaluation'不包含'GetEnumerator'的公共定义“ – dasdasd

+0

该模型需要修改才能使用IGrouping。 – vijayst

+0

我这样做就像你说的,而不是公共虚拟列表评价我有公共虚拟IGrouping 评估 – dasdasd

你需要确保评估是参照一门课程组成:

public class Evaluation 
{ 

    public virtual int EvaluationId { get; set; } 

    public virtual int CourseId { get; set; } 
    public virtual Course Course { get; set; } 

    public virtual int ComponentId { get; set; } 
    public virtual Component Component { get; set; } 

    public virtual int UserId { get; set; } 
    public virtual UserProfile User { get; set; } 

    public virtual int Grade { get; set; } 
} 

以下是一些测试值:

var users = new List<UserProfile> 
{ 
    new UserProfile { UserId = 1, UserName = "Jim" }, 
    new UserProfile { UserId = 2, UserName = "Sam" }, 
}; 

var components = new List<Component> 
{ 
    new Component { ComponentId = 1, NameComp = "Unit 1" }, 
    new Component { ComponentId = 2, NameComp = "Unit 2" } 
}; 

var course = new Course 
{ 
    Users = users, 
    Components = components.OrderBy(c => c.ComponentId).ToList(), 
    Evaluation = new List<Evaluation> 
    { 
     new Evaluation { User = users[0], ComponentId = components[0].ComponentId, Grade = 87 }, 
     new Evaluation { User = users[0], ComponentId = components[1].ComponentId, Grade = 99 },     
     new Evaluation { User = users[1], ComponentId = components[0].ComponentId, Grade = 75 }, 
     new Evaluation { User = users[1], ComponentId = components[1].ComponentId, Grade = 65 } 
    } 
}; 

而继Razor视图应该做你需要的东西:

@model SGP.Models.Course 

<table> 
    <tr> 
     <th> 
      Username 
     </th> 
     @foreach (var x in Model.Components) 
     { 
      <th> 
       @Html.DisplayFor(modelItem => x.NameComp) 
      </th> 
     } 
     <th></th> 
    </tr> 

    @foreach (var userEvaluation in Model.Evaluation.GroupBy(e => e.User)) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => userEvaluation.Key.UserName) 
      </td> 
      @foreach (var x in Model.Components) 
      { 
       <td> 
        @(userEvaluation.FirstOrDefault(e => e.ComponentId == x.ComponentId)?.Grade) 
       </td> 
       } 
     <td></td> 
    </tr> 
} 

观看了这个模型,它有很多循环引用,如果你正在使用的东西,可以是有问题像实体框架。

+0

我已经做了你说的,但它给这里一个错误︰@ userEvaluation.FirstOrDefault(e = > e.ComponentId == x.ComponentId).Grade,错误:对象引用未设置为对象的实例。 – dasdasd

+0

对不起,忘了空检查。我把它切换到上面。只要您使用包含C#6的.NET新版本之一,它就可以工作。 '@(userEvaluation.FirstOrDefault(e => e.ComponentId == x.ComponentId)?. Grade)' –