ASP.NET MVCで表示する必要があるこの階層データのViewModelをどのように構成する必要がありますか?

StackOverflow https://stackoverflow.com/questions/1018679

質問

次のようなビューがあります:

alt text

このビューのViewModelをどのように表現すべきかを考えています。各「代理店」複数の「事業単位」を持つことができます。および各「ビジネスユニット」複数の「クライアント」を持つことができます。

データベースでは、Agency、BusinessUnit、およびClientテーブルのマッピングテーブルと外部キーで簡単にこれを表します。

ただし、LINQを使用してこのデータをデータベースからクエリし、このツリー状の構造を表すViewModelオブジェクトを作成して、ビューをレンダリングできるようにする必要があります。

使用するデータ構造、またはC#コードのこの階層構造でViewModelがどのように見えるかについてのヒントを教えてください。このビューに渡すには、ViewModelオブジェクトを作成する必要があります。

ViewModelの表現方法に関する提案は歓迎します!

役に立ちましたか?

解決

ビューインスタンスに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;
}

他のヒント

Linq2Sql実装がデータベースと同じ関係を持っていると仮定すると(デザイナーにドラッグアンドドロップした場合、間違いなくそうなります)、ここでアプローチします。

各セクション(代理店、あなたの場合)を表す、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"); %> 
<%}%>

データ読み込みオプションを使用する理由は、ビューでの遅延読み込みを回避するためです。モデルに必要なデータをすべて詰め込ませます。

あなたの質問を正しく理解できたことを願っています...

最近、「ADO .Net Entity Data Model」を使用しています。階層データをサポートするMSSQLデータベースへの接続を制御するテンプレートであり、うまく機能しています。

プレゼンテーションレイヤーをデータモデルに直接結び付けることができます。

データベースにキーが正しく設定されていれば、すぐに起動して実行できます。ADO.Net3.5も必要だと思います

ADOの作成。 NET Entity Frameworkエンティティ

エンティティのMS情報

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top