4 Stimmen

Wie sollte ich mein ViewModel für diese hierarchischen Daten strukturieren, die ich in ASP.NET MVC anzeigen muss?

Ich habe eine Ansicht, die wie folgt aussehen wird:

alt text

Ich versuche, herauszufinden, wie ich mein ViewModel für diese Ansicht darstellen sollte. Jede "Agentur" kann mehrere "Geschäftseinheiten" haben und jede "Geschäftseinheit" kann mehrere "Kunden" haben.

In der Datenbank stelle ich dies einfach mit einer Zuordnungstabelle und Fremdschlüsseln für die Tabellen Agency, BusinessUnit und Client dar.

Jetzt muss ich jedoch LINQ verwenden, um diese Daten aus der Datenbank abzufragen und dann ein ViewModel-Objekt zu erstellen, das diese baumartige Struktur darstellt, damit meine Ansicht sie darstellen kann.

Kann mir jemand Tipps geben, welche Datenstruktur ich verwenden sollte, oder wie mein ViewModel für diese hierarchische Struktur in C#-Code aussehen könnte? Ich muss mein ViewModel-Objekt erstellen, um es an diese Ansicht zu übergeben.

Für Vorschläge, wie das ViewModel dargestellt werden kann, bin ich dankbar!

1voto

Spencer Ruport Punkte 34547

Speichern Sie einfach eine Listeninstanz in Ihren Ansichtsdaten?

public class Agency
{
   public List<BusinessUnit> Units;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(BusinessUnit unit in units)
            ret += unit.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties
}
public class BusinessUnit
{
   public List<Client> clients;
   public string Name;
   public int NumberOfAccounts
   {
      get 
      {
         int ret = 0;
         foreach(Client client in clients)
            ret += client.NumberOfAccounts;
         return ret;
      }
   }
   // ... continue this strategy for other properties

}
public class Client
{
   public string Name;
   public int NumberOfAccounts;
}

0voto

Jay Punkte 2605

Ich habe vor kurzem die Vorlage "ADO.Net Entity Data Model" verwendet, um die Konnektivität zu einer MSSQL-Datenbank zu steuern, die Hierarchiedaten unterstützt, und es hat gut funktioniert.

Sie können Ihre Präsentationsschicht einfach direkt mit den Datenmodellen verbinden.

Wenn Ihre Schlüssel in der Datenbank richtig gesetzt sind, ist es ein Kinderspiel, sie zum Laufen zu bringen. Ich glaube, es erfordert auch ADO.Net 3.5.

ADO.NET Entity Framework-Entität erstellen

MS-Informationen zur Entität

0voto

KevDog Punkte 5665

Unter der Annahme, dass Ihre Linq2Sql-Implementierung die gleichen Beziehungen in es als die Datenbank hat (die, wenn Sie Drag & Drop auf den Designer getan haben, sie definitiv tun), hier ist, wie ich es angehen würde.

Ich würde eine stark typisierte partielle Ansicht des Typs Agentur erstellen, die jeden Abschnitt (in Ihrem Fall die Agentur) darstellt, und sie AgencyReportSection.ascx nennen. Dieses Steuerelement nimmt eine Agentur, iteriert durch ihre Geschäftsbereiche, die wiederum durch ihre Kunden iterieren.

Wo auch immer Sie Ihre Daten verpacken, gehen Sie folgendermaßen vor:

DataContext context = new DataContext();
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Agency>(a => a.BusinessUnit);
options.LoadWith<BusinessUnit>(b => b.Client); 

context.LoadOptions = options;

Das bedeutet, dass der Kontext, wenn er eine Agentur erhält, den definierten Beziehungen folgt und Ihnen diese Objekte ebenfalls zur Verfügung stellt. Sie erhalten also:

Agency a = context.Agency.FirstOrDefault();
IEnumerable<BusinessUnit> units = a.BusinessUnits;
IEnumerable<Client> clients = units.Clients;

Ihre Ansicht könnte etwa so aussehen:

<% foreach(var agency in agencies)%{>
<% Html.RenderPartial("AgencyReportSection"); %> 
<%}%>

Der Grund, warum Sie die Option zum Laden von Daten verwenden, besteht darin, das faule Laden in der Ansicht zu vermeiden und das Modell alle erforderlichen Daten packen zu lassen.

Ich hoffe, ich habe Ihre Frage richtig verstanden...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X