ASP.NET MVCで表示する必要があるこの階層データのViewModelをどのように構成する必要がありますか?
-
06-07-2019 - |
質問
次のようなビューがあります:
このビューの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も必要だと思います