在视图中显示列表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)
我该怎么做?由于
在课程评价的定义应该是:
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>
你需要确保评估是参照一门课程组成:
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>
}
观看了这个模型,它有很多循环引用,如果你正在使用的东西,可以是有问题像实体框架。
我已经做了你说的,但它给这里一个错误︰@ userEvaluation.FirstOrDefault(e = > e.ComponentId == x.ComponentId).Grade,错误:对象引用未设置为对象的实例。 – dasdasd
对不起,忘了空检查。我把它切换到上面。只要您使用包含C#6的.NET新版本之一,它就可以工作。 '@(userEvaluation.FirstOrDefault(e => e.ComponentId == x.ComponentId)?. Grade)' –
模型看起来不正确。理想情况下,评估应该由UserId分组。它应该是IGrouping 评估或列表 >>评估。 –
vijayst