2011-01-17 18 views
1

Ich bin auf der Suche nach einer Möglichkeit, eine Tabelle aus meinem Modell, das vom Typ IEnumerable<Person> ist. Ich versuche, die folgende Tabelle zu generieren:ASP.NET MVC Gitter/Tabelle

<table> 
    <tr class="person"> 
     <td>First 1</td> 
     <td>Last 1</td> 
     <td>1</td> 
    </tr> 
    <tr class="child"> 
     <td>First 1</td> 
     <td>Last 1</td> 
     <td>1</td> 
    </tr> 
    <tr class="child"> 
     <td>First 2</td> 
     <td>Last 2</td> 
     <td>2</td> 
    </tr> 
    ... 
    ... 
</table> 

Jede Person eine Zeile und jedes ihrer Kinder würde einzelne Zeilen unter der Person Reihe sein. Dies würde für jede Person in IEnumerable<Person> wiederholen.

Gibt es Gitter oder Komponenten, die eine Tabelle wie diese erzeugen? Ich habe MvcContrib's grid component gefunden, aber es scheint nicht in der Lage zu sein, diese untergeordneten Zeilen zu generieren. Gibt es eine Möglichkeit, das Grid von MvcContrib dafür zu erweitern?

Antwort

3

Wenn alles, was Sie in Ihrer Ausgabe benötigen, eine Tabelle ist, würde so etwas wie eine geschachtelte Schleife für Sie arbeiten?

<table> 
<% foreach (Person person in Model) 
    { %> 

    <tr class="person"> 
    <td><%: person.First %></td> 
    <td><%: person.Last %></td> 
    <td><%: person.Age %></td> 
    </tr> 

    <% foreach (Child child in person.Children) { %> 

    <tr class="child"> 
    <td><%: child.First %></td> 
    <td><%: child.Last %></td> 
    <td><%: child.Age %></td> 
    </tr> 

    <%} %> 

<%} %> 
</table> 
+0

Diese Art der Verschachtelung wird auf einer großen Anzahl von Seiten auf unserer Website verwendet. Sie verwenden alle die gleichen Stile/Klassen, aber das Modell ist auf jeder Seite etwas anders. Ich versuche, das Kopieren/Einfügen all dieses HTML zu vermeiden und die Spaltenüberschriften usw. zu ändern. – nivlam

3

Ich würde sie von IPerson machen beide implementieren und dann eine DisplayTemplate erstellen, die stark an IPerson getippt wurde dann durch die Schleife und nennen es

public interface IPerson 
{ 
    string First { get; set; } 
    string Last { get; set; } 
    int Age { get; set; } 
} 

<%@ Control Language="C#" Inherits="ViewUserControl<IPerson>" %> 

<tr class="<%=Model.GetType().Name.ToLower() %>"> 
    <td><%: Model.First %></td> 
    <td><%: Model.Last %></td> 
    <td><%: Model.Age %></td> 
</tr> 

<table> 
<% foreach (Person person in Model) { %> 
    <%=Html.DisplayFor(m => person, "IPersonRow") %> 
    <% foreach (Child child in person.Children) { %> 
    <%=Html.DisplayFor(m => child, "IPersonRow") %> 
    <% } %> 
<% } %> 
</table> 
+0

Ich habe vielleicht ein schlechtes Beispiel benutzt. Die Klassen "Person" und "Child" haben nicht unbedingt die gleichen Eigenschaften. Sie können völlig verschieden sein. Diese Art der Verschachtelung wird auf einer großen Anzahl von Seiten auf unserer Website verwendet. Sie verwenden alle die gleichen Stile/Klassen, aber das Modell ist auf jeder Seite etwas anders. – nivlam

+0

immer noch, kein schlechtes Muster ... Erstellen Sie eine Zeile DisplayTemplate für jede Art von Sache, die Sie brauchen könnten, und Sie können es leicht verkabeln – hunter

0

Das gute Questio n !! Können wir child2 Elter 2 Kind 3

Wenn ja,

Erstellen Sie ein Benutzersteuerung, die alle Childs für einen Elternteil gedruckt wird, verwenden Sie diese Steuerung für Sie folgende

Eltern Kind Elternteil 1 Kind 1, Rendern der untergeordneten Spalte

Bitte lassen Sie mich wissen, wenn Sie eine andere Abfrage haben.

Lassen Sie uns zusammen lernen