2009-06-19 6 views
4

J'ai une vue qui ressemblera à ceci:Comment dois-je structurer mon ViewModel pour les données hiérarchiques que je dois afficher dans ASP.NET MVC?

alt text

J'essaie de comprendre comment je représenter mon ViewModel pour ce point de vue. Chaque "Agence" peut avoir plusieurs "Business Units" et chaque "Business Unit" peut avoir plusieurs "Clients".

Dans la base de données, je représente facilement ceci avec une table de mappage et des clés étrangères pour les tables Agency, BusinessUnit et Client.

Cependant, maintenant je dois utiliser LINQ pour interroger ces données hors de la base de données, puis construire un objet ViewModel qui représente cette structure arborescente afin que mon View puisse le rendre. Est-ce que quelqu'un peut me donner des conseils sur quelle structure de données je devrais utiliser, ou à quoi pourrait ressembler mon ViewModel pour cette structure hiérarchique en code C#? J'ai besoin de créer mon objet ViewModel pour passer à cette vue.

Toutes les suggestions sur la façon de représenter le ViewModel sont appréciées!

Répondre

1

magasin juste une liste instance dans vos données de vue?

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

J'ai récemment utilisé le modèle "ADO .Net Entity Data Model" pour contrôler la connectivité à une base de données MSSQL qui prend en charge les données de la hiérarchie et cela a bien fonctionné.

Vous pouvez simplement lier votre couche de présentation directement aux modèles de données.

Si vos clés sont correctement définies dans la base de données est un composant logiciel enfichable pour se lever et running..I pense qu'il faut aussi ADO.Net 3,5

Creating ADO.NET Entity Framework Entity

MS information on entity

+0

Malheureusement, nous devons nous en tenir à la pile de technologie que nous utilisons actuellement. Je dois faire comme je l'ai dit dans ma question, construire un objet ViewModel intermédiaire et le transmettre à ma vue. – KingNestor

0

En supposant que votre mise en œuvre de Linq2Sql a les mêmes relations dans ce que la base de données (qui, si vous avez fait glisser-déposer pour le concepteur, ils le font sans aucun doute), voici comment je l'aborder.

Je créerais une vue partielle fortement typée de l'Agence de type qui représenterait chaque section (Agence, dans votre cas), appelez AgencyReportSection.ascx. Ce contrôle va prendre une agence, itérer à travers ses unités d'affaires, qui à son tour itérer à travers ses clients.

Où que vous conditionnez vos données, faire quelque chose comme ceci:

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

context.LoadOptions = options; 

Ce que cela va vous donner est que lorsque le contexte devient une agence, il suivra les relations définies et vous donner ces objets comme bien. Ainsi, vous obtenez:

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

Votre vue pourrait faire quelque chose comme:

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

La raison pour laquelle vous faites l'option de chargement de données est d'éviter le chargement paresseux dans la vue, laisser emballer le modèle tout le données nécessaires.

J'espère avoir bien compris votre question ...

Questions connexes