2016-08-01 12 views
0

私はモデルコース、モデルのコンポーネントとモデルの評価を持っていますとそれぞれのグレード。 私はこの方法で試してみました:表示ビューのリストMVC 4

@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> 
} 

をしかし、これは私の一つの列内のすべてのコンポーネントを与え、私は1つの各コンポーネントの列、およびそれぞれについてのグレードが必要です。

コードを私は、この与えています

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 EvaluationsまたはList >>評価が必要です。 – vijayst

答えて

0

は、コース内評価の定義は次のようになります。

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

"SGP.Models.Evaluation"に 'GetEnumerator'のパブリック定義が含まれていないため、foreach文は 'SGP.Models.Evaluation'型の変数に対しては動作できません。 " – dasdasd

+0

IGroupingを使用するには、モデルを修正する必要があります。 – vijayst

+0

パブリックバーチャルリストの代わりにあなたが言ったようにしました評価私はパブリック仮想IGroupingを持っています<文字列、評価>評価 – dasdasd

0

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 } 
    } 
}; 

かみそりビューを次はあなたが必要なものを行う必要があります。

@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> 
} 

は、このモデルのために気をつけて、あなたが何かを使用している場合、それが問題となる可能性が循環参照、をたくさん持っていますEntity Frameworkのようなものです。

+0

私はあなたが言ったことをしましたが、ここでエラーが発生します:@ userEvaluation.FirstOrDefault > e.ComponentId == x.ComponentId).Grade、エラー:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – dasdasd

+0

申し訳ありません、ヌルチェックを忘れました。私は上にそれを切り替えた。 C#6を含む最新の.NETリリースを使用している限り、動作するはずです。 '@(userEvaluation.FirstOrDefault(e => e.ComponentId == x.ComponentId)?. Grade)' –

関連する問題