ASP.NET MVC でマルチビュー ポータル アプリケーションを構築する方法
-
22-09-2019 - |
質問
私はちょうどサンフランシスコで ASP.NET MVC に関する Scott Hanselman のプレゼンテーションを見ていました。しばらく考えた後、[ポータル|モジュラー|マルチビュー] 構造 (好みの定義を選択) を持つ ASP.NET MVC ベースのサイトを構築する最善のアプローチ方法について困惑しました。
私が何を求めているかを説明すると、私の会社は、独自のクエリ文字列とルートに応答できるマッピング モジュール、同様に独自の税金小包情報モジュールを組み込んだクライアント向けのポータル スタイルのアプリケーションを多数構築しています。ビュー、単一および複数のドキュメントを表示するドキュメント検索ビュー...おわかりでしょう。重要な部分は、各モジュールが真にスタンドアロンであるということです。ユーザーが名前で納税記録を検索すると、10 件の結果が表示される場合があります (「JOHN DOE」はいくつかのプロパティを所有しています)。Web サイト アプリケーション フレームワークは利用可能なマップ モジュールがあることを認識しているため、各結果には「Map it」リンクがあります。「Map it」リンクは、次のような適切なリクエストを送信します。 http://myapp.com/taxparcel/map/123443. 。マップ モジュール コントローラーは、マップをズームして税区画を強調表示することで、外部リクエストに応答します。
この全体の流れの鍵となるのは、 両方 税モジュールとマッピング モジュールは同じ Web ページ上にあります。
では、それは ASP.NET MVC ボックスにどのように適合するのでしょうか?部分的?サブビュー?1 つのコントローラーに複数のビューが表示されますか?ドキュメントの明白な部分を私が見逃しているだけであれば、リンクを含めて公に私を非難してください。それ以外の場合は、ご提案をお待ちしております。
解決
さて、拡張ポイントを提供するために、あなたのビューモデルが必要。私は、ビューのデータは、これらのモジュール部分を含有していることを前提とし、何らかの形で制御装置によって撮像された
public ActionResult Search(string text)
{
var model = seachService.Search(text)
// here either:
// 1. model contains .Modules collection and is populated by the service, or
// 2. controller does
var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model));
// i.e. it adds modules-specific information to the view data
return View(model);
}
さて、モジュール固有のデータが表示が使用できることを何かにSearchViewModelによって変換されます:
public interface IModuleSpecificViewPart
{
public IList<string> GetAdditionalLinksForUser();
public void RenderAdditionalInfo(Response response);
}
と、あなたのビューがありません。
<%= Model.Results[i] %>
<% foreach (var module in Model.ModuleSpecific) { %>
<a href="<%=module.AdditionalLink%>">More</a>
<% module.RenderAdditionalInfo(Response); %>
<% } %>
やモジュールビューモデルは、仕事をすること、それはmodules.GetModulesFor(だことなどの注意を部分ビュー名を提供)とSearchViewModelすることができます - 例えば、SearchViewModelはIoC.GetInstanceByType(「ModuleViewModel」+ passedModule.GetType()を行うことができます。名) - 。自動的に特定のモジュールのビューモデルクラスを拾っ
これはアイデアです。それは私が完全に間違っているあなたの質問を理解することができる - 。そうであれば申し訳ありません。
一つのアドバイスは、私は個人的に、私はあまりにも一般的なことしようとした場合、それはプロジェクト(私も<のhref = "http://sprokhorenko.blogspot.com/2009/09/domain-drivenに不必要な合併症を追加することがわかりました-design-聞くツーyour.html」のrel = "nofollowをnoreferrer">)それについてを書きました。即ちはい、あなたのモジュールがコンパイル時に不明であるが、あなたはそれについて何かを知っている必要があります!ここではそのための拡張ポイントだ - 彼らは結果を検索するためのリンクを追加することができます。一つは、画像の「何」のための拡張ポイントを、その最初のあなたの特定の例をリストする必要があります。
することはできません他のヒント
queen3 の返信はあなたの特定の問題により適していると思いますが、とにかく一般的な問題について私の考えを投稿したいと思いました。
で説明したテクニックを使用して同様のことを行うことを検討しています。 マシュー・アボットさんの ブログ投稿. 。MEF を使用すると、新しい DLL をポータルにドロップするだけでモジュールをアクティブ化できます。
1 つのページに複数のモジュールを配置するのは少し面倒です。 RenderPartial
機能する可能性もありますが、これは通常、同じビューモデルから機能するコードを追加することを目的としています。 RenderAction
一方、 は独自のコントローラーとモデルを使用します。私は通常、使用することを好まない RenderAction
他のシナリオでは、MVC パターンが壊れるか、少なくとも畳み込まれるためです。ただし、この場合は、複数のモジュールのレイアウトを担当する単一のページでのみ使用されます。すべてのプラグインは、通常の MVC ビュー、コントローラー、モデルにすることができます。
詳細はこちら RenderAction
見つけることができます ここ.