2009-05-21 5 views
3

ich eine .NET MVC-Anwendung bin die Schaffung und ich habe eine Ansicht, in der ich folgendes angezeigt werden soll:.NET MVC Passing Verschachtelte Daten von Controller anzeigen

Kategorie

gefolgt von einer Liste von Artikel für die aktuelle Kategorie

[möglicherweise] durch eine Liste von Unterpunkte für die aktuelle Position gefolgt

Ich könnte eine benutzerdefinierte ViewModel-Klasse erstellen, die 3 separate IEnumerable-Listen (Kategorien, Elemente und Unterelemente) sendet. Das Problem bei diesem Ansatz besteht darin, dass es keine einfache Möglichkeit gibt, die Daten in der richtigen Reihenfolge (Hierarchie) in der Ansicht zu rendern. Mit diesem Ansatz würde ich drei Listen haben und dann bedingte Logik während des Renderings hinzufügen. Das würde bedeuten, dass jede Objekteliste mehrmals durchlaufen würde, wenn ich versuche, die Objekte an der richtigen Stelle auf der Seite zu platzieren.

Ich würde lieber die Daten in der richtigen Reihenfolge zurückgeben, vielleicht als eine XML-Datei. Was ist der richtige Ansatz hier?

Ich habe auch erwogen, die Daten im Controller zu verketten und den formatierten Text an die Ansicht zu übergeben, aber dies scheint die Vorstellung zu verletzen, dass das View-Handle-Rendering funktioniert.

Antwort

3

Ich würde hier von XML bleiben. Übergeben Sie die richtige Hierarchie; das scheint vernünftig:

public class ViewModel 
{ 
    Category[] Categories { get; set; } 
} 

public class Category 
{ 
    Item[] Items { get; set; } 
} 

public class Item 
{ 
    Item[] SubItems { get; set; } 
} 

dann können Sie foreach Schleifen in Ihrer Ansicht verschachtelt sind.

+0

Dies scheint, was Dennis vorgeschlagen hat. Danke für den Hinweis. – mikerennick

0

Was Sie wahrscheinlich tun sollten, ist eine Custom Type mit Ihrer Liste von Kategorien, und jedes Element hat eine Eigenschaft, in der die Unterelemente enthalten sind.

Dies kann leicht in Entity Framework unter Verwendung Navigation Properites erreicht werden.

0

Ich würde die Kategorie Model-Klasse mit einer Artikeleigenschaft des Typs IEnumerable<item> einrichten. Geben Sie eine IEnumerable<subItem> subItems Eigenschaft in die Klasse ein.

Die Ansicht würde sehr einfach durch diese Elemente und Unterelemente iterieren.

Edit: eigentlich, wenn Unterelemente als Elemente genau gleich sind, dann könnte es nur eine einzige item Klasse mit einer IEnumerable<item> subItems Eigenschaft sein. Dies würde auch unbegrenzte Ebenen von Unterelementen ermöglichen.