Как мне структурировать ViewModel для этих иерархических данных, которые мне нужно отображать в ASP.NET MVC? - PullRequest
4 голосов
/ 19 июня 2009

У меня есть вид, который будет выглядеть так:

alt text

Я пытаюсь выяснить, как мне представить мою ViewModel для этого представления. Каждое «Агентство» может иметь несколько «Бизнес-единиц», а каждая «Бизнес-единица» может иметь несколько «Клиентов».

В базе данных я легко представляю это с помощью таблицы сопоставления и внешних ключей для таблиц Agency, BusinessUnit и Client.

Однако теперь мне нужно использовать LINQ для запроса этих данных из базы данных, а затем создать объект ViewModel, который представляет эту древовидную структуру, чтобы мой View мог отображать ее.

Может кто-нибудь дать мне советы о том, какую структуру данных мне следует использовать, или как мой ViewModel может выглядеть для этой иерархической структуры в коде C #? Мне нужно создать мой объект ViewModel, чтобы перейти к этому представлению.

Любые предложения о том, как представлять ViewModel, приветствуются!

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Просто сохранить экземпляр списка в ваших данных просмотра?

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 голосов
/ 20 июня 2009

Предполагая, что ваша реализация Linq2Sql имеет те же отношения в ней, что и база данных (что, если вы перетаскиваете в конструктор, они определенно имеют), вот как я бы подошел к ней.

Я бы создал строго типизированное частичное представление типа Agency, которое представляло бы каждый раздел (Agency, в вашем случае), назовите его AgencyReportSection.ascx. Этот контроль возьмет на себя агентство, перебирает свои бизнес-единицы, которые, в свою очередь, перебирают своих клиентов.

Где бы вы ни собирали данные, делайте что-то вроде этого:

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

context.LoadOptions = options;

Что это даст вам, так это то, что когда контекст получает агентство, он будет следовать определенным отношениям и также предоставит вам эти объекты. Итак, вы получите:

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

Ваш взгляд может сделать что-то вроде:

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

Причина, по которой вы используете опцию загрузки данных, состоит в том, чтобы избежать отложенной загрузки в представлении, чтобы модель собрала все необходимые данные.

Надеюсь, я правильно понял ваш вопрос ...

0 голосов
/ 19 июня 2009

Недавно я использовал шаблон «ADO .Net Entity Data Model» для управления подключением к базе данных MSSQL, которая поддерживает данные иерархии, и она работала хорошо.

Вы можете просто привязать свой уровень представления непосредственно к моделям данных.

Если ваши ключи правильно настроены в базе данных, их легко запустить и запустить .. Я думаю, что это также требует ADO.Net 3.5

Создание объекта ADO.NET Entity Framework

MS информация об объекте

...