2016-08-01 11 views
0

ich ein Modell Course, ein Modell-Komponente und ein Modell Bewertung haben:Eine Liste in einer Ansicht 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; } 
} 

ich mit allen Benutzern in einer Ansicht eine Tabelle zeigen, müssen alle Komponenten erstellt und die Note für jeden. Ich habe versucht, auf diese Weise:

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

Aber das gibt mir alle Komponenten in einer Spalte, und ich brauche eine Spalte für jede Komponente und eine Note für jeden:

Der Code das habe ich gibt:

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

Und ich brauche:

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

Wie kann ich das tun?

Dank
+0

Das Modell sieht nicht korrekt aus. Im Idealfall sollte die Auswertung nach UserId gruppiert werden. Es sollte IGrouping sein Auswertungen oder Liste >> Auswertungen. – vijayst

Antwort

0

Die Definition von Auswertungen im Kurs sollte sein:

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

Der Code soll:

@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

Es gibt einen Fehler in der @foreach (var Element in Gruppe): "foreach-Anweisung kann nicht auf Variable vom Typ 'SGP.Models.Evaluation' operieren, weil 'SGP.Models.Evaluation' keine öffentliche Definition für 'GetEnumerator' enthält " – dasdasd

+0

Das Modell muss geändert werden, um IGrouping zu verwenden. – vijayst

+0

Ich habe es getan, wie Sie sagten, anstelle der öffentlichen virtuellen Liste Auswertung ich habe öffentliche virtuelle IGrouping Bewertungen – dasdasd

0

Sie müssen die Bewertung in Bezug auf sicherzustellen, dass ist zu einer Kurs-Komponente:

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

Hier sind einige Testwerte:

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

Und Ansicht Razor folgende tun sollten, was Sie brauchen:

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

für dieses Modell Pass auf, es hat eine Menge von zirkulären Referenzen, die, wenn Sie etwas verwenden sind problematisch sein kann wie Entity Framework.

+0

Ich habe getan, was Sie sagten, aber es gibt einen Fehler hier: @ userEvaluation.FirstOrDefault (e = > e.ComponentId == x.ComponentId) .Grade, der Fehler: Objektreferenz wurde nicht auf eine Instanz eines Objekts gesetzt. – dasdasd

+0

Sorry, habe den Null-Check vergessen. Ich habe es oben geschaltet. Solange Sie eine der neueren Versionen von .NET verwenden, die C# 6 enthält, sollte es funktionieren. '@ (userEvaluation.FirstOrDefault (e => e.ComponentId == x.ComponentId)?. Note)' –

Verwandte Themen