我应该如何为我需要在ASP.NET MVC中显示的分层数据构建我的ViewModel?

时间:2009-06-19 15:44:08

标签: asp.net-mvc treeview tree viewmodel

我有一个看起来像这样的观点:

alt text

我正在试图弄清楚我应该如何为这个视图代表我的ViewModel。每个“代理商”可以有多个“业务单位”,每个“业务单位”可以有几个“客户”。

在数据库中,我可以使用映射表和代理,BusinessUnit和Client表的外键轻松表示这一点。

但是,现在我需要使用LINQ从数据库中查询这些数据,然后构造一个表示这种树状结构的ViewModel对象,以便我的View可以呈现它。

任何人都可以给我一些关于我应该使用什么数据结构的提示,或者我的ViewModel在C#代码中对于这种层次结构的看法?我需要创建我的ViewModel对象以传递给该视图。

欢迎任何有关如何表示ViewModel的建议!

3 个答案:

答案 0 :(得分:1)

只需在视图数据中存储List实例吗?

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

答案 1 :(得分:0)

我最近使用“ADO .Net实体数据模型”模板来控制与支持层次结构数据的MSSQL数据库的连接,并且它一直运行良好。

您可以直接将表示层与数据模型联系起来。

如果您的密钥在数据库中设置正确,则可以快速启动并运行..我认为它还需要ADO.Net 3.5

Creating ADO.NET Entity Framework Entity

MS information on entity

答案 2 :(得分:0)

假设您的Linq2Sql实现与数据库具有相同的关系(如果您拖放到设计器中,它们肯定会这样做),这就是我接近它的方式。

我会创建一个代表每个部分(代理商,在您的情况下)的代理类型的强类型部分视图,称之为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"); %> 
<%}%>

您正在执行数据加载选项的原因是为了避免视图中的延迟加载,让模型打包所有必要的数据。

我希望我能正确理解你的问题......