2

これは一種の建築哲学の質問です:)

非常にシンプルなモジュラーMVCベースの「CMS」を作成したい画像。実際、実行したいのは、次のようなもの(pseudolang)を使用してすべてのページの構造(たとえばXML)を指定できることだけです。

レイアウトを使用:Subpage.cshtml
セクション「Header」(レイアウトのプレースホルダー)レンダリングコントローラー「Header」の場合、アクション「SubpageHeader」
セクション「LeftCol」のレンダリングコントローラ「メニュー」アクション「メインメニュー」
セクション「コンテンツ」のレンダリングコントローラ「記事」アクション「リスト」
等

それで、これを行うためのエレガントで推奨される方法は何ですか?私は今2つの方法を考えることができます:

オプション1:

独自のルートを定義します。これにより、目的のURLをキャッチし、このリクエストに対して独自のMyMvcHandlerを作成します。このハンドラーでは、処理はコントローラーをインスタンス化しません(「メイン」は1つではありません)。代わりに、「ページ構造構成」(上記の例)を読み取り、必要なすべてのコントローラーをインスタンス化します。この点-アクションの結果を収集してレイアウトに配置する方法は?

オプション2:デフォルトのMvcHandlerを有効にし、常にデフォルトのアクションで「MasterController」を呼び出します。これにより、View(layoutPage)のみが返されます。レイアウトページで、Html.RenderActionと同様に、独自のヘルパーメソッドとして「ページセクション」(コンテンツのプレースホルダー)を実装します。これは、「ページ構造の構成」を調べて適切なコントローラー+アクションをレンダリングするようにカスタマイズされているだけです。しかし、このように、MasterControllerは私にはパイプラインで本当に役に立たないように見えます、彼を取り除く方法はありますか?

もっと良い方法を考えられますか?このアプローチのいずれかの基本的な浮き沈みを見ることができますか?このテーマに関するいくつかの優れたリソースを教えていただけますか?(私は何も見つかりません)。

MVC忍者に感謝します;)

4

3 に答える 3

0

マスター ページは、目標を達成するためのより簡単な方法です。マスター ページを使用して、アプリケーション内の複数のページで共通のコンテンツを共有できます。ビュー マスター ページを使用してページ レイアウトを作成するための ASP.net MVC Web ページへのリンクを次に示します。

お役に立てれば。

于 2012-08-27T17:21:01.103 に答える
0

さまざまなコントローラーが必要であり、焦点は CMS のようなものであるため、次のことをお勧めします。

  1. ユーザーに表示されるプライマリ URL とレイアウトを処理するコントローラーを 1 つ用意します (オプション 2 のように)

  2. セクションごとに、各セクション (ヘッダー/メニュー/記事/その他) の HTML を取得するための Ajax コールバックを用意します。

はい、これにより 4 回の呼び出しが行われますが、トレードオフは大きくなります。

たとえば、次のような利点があります。

  1. 各セクションは、独立したキャッシュ ヘッダーを持つことができるようになりました。(例: レイアウトは変更時ではなく、数日/数週間キャッシュできます)

  2. 各セクションは、クライアントがページを移動したり更新したりしなくても、個別に更新できます。

  3. 各セクションは個別に処理されるため、必要に応じて SignalR を使用してライブ更新を処理できます。

  4. セクション (さらに分割される可能性があると仮定) は、ページ間で共有できます。(例: 複数の画面で該当する場合は記事を再利用できます...また、利点 #1 と同じキャッシングの利点に該当します)

  5. 各セクションの変更は、必要に応じて、各コンテンツを更新しながらパラメーターを介して行うことができます。

  6. 各セクション/コントローラー/アクションは、必要に応じて HTML の代わりに Json を返すように簡単に操作できるため、クライアント側で機能的なエクスペリエンスを強化できます。(これは、ノックアウトのようなフレームワークでクライアント側の MVC を実行していないことを前提としています)

お役に立てれば。

于 2012-08-23T15:48:39.447 に答える
0

あなたが言及した方法(セクションアプローチよりも柔軟です)のために、それは確かに可能です:

Html.RenderAction("AnyAction", "AnyController")

その概念の最大の問題は状態だと思います。このルートに進み、「AnyController」が状態を維持する必要がある場合は、それを形式化する必要があります。それ以外の場合: クエリ文字列とポスト変数に対して権限を持つのは誰ですか? また、変数名が衝突した場合はどうしますか?

ASP.NET クラシックは、ポストバック状態フィールドでこの問題を何らかの形で「解決」していることに注意してください。すべてのページ要素に一意の ID を割り当て、それをツリーに配置します。これの最大の欠点は、ASP.NET クラシックでよくあるように、すぐに肥大化して非効率になる可能性があることです。

この問題が N2CMS などの他の CMS でどのように解決されているかを確認することもできます (免責事項: 私は他の CMS の経験がほとんどありません)。その実装は、2番目のオプションに似ていると思います。CMS 内でどのブロックがどの領域に入るかを指定すると、システムはすべてのビューを呼び出します。違いは、サブビューの場合、ビューのコンテンツ モデルは特定のコントローラーではなくシステムによって決定されることですが、RenderView の代わりに RenderAction を呼び出すことで概念的に変更することができます (実際にどの程度実現可能かはわかりません)。しかし、その場合、あなたは再び州の議論に参加しています。

于 2012-08-30T05:57:43.153 に答える