現在の Asp.net MVC アプリケーションには、2 つのメニュー システムがあり、1 つは上部にあり、もう 1 つは左側にあります。これで、メニューをレンダリングする部分ビューができましたが、これが機能してすべての ViewModel でメニュー項目を返す唯一の方法でしょうか? ViewData ディクショナリを使用しないようにしています。
これに対する答えはイエスだと思いますが、他の人がどう思うか知りたいです
現在の Asp.net MVC アプリケーションには、2 つのメニュー システムがあり、1 つは上部にあり、もう 1 つは左側にあります。これで、メニューをレンダリングする部分ビューができましたが、これが機能してすべての ViewModel でメニュー項目を返す唯一の方法でしょうか? ViewData ディクショナリを使用しないようにしています。
これに対する答えはイエスだと思いますが、他の人がどう思うか知りたいです
3 オプション:
Ryanが答えたようにRenderPartial。
たとえば、抽象 MasterViewModel です。すべての out モデルはこれから継承します。アクション フィルターによって入力されます。
メイン ビュー モデルを使用する以外に、独自のコントローラーなどをメニューに使用する場合は、 MVC Future のライブラリの Render Action を使用できます。
ベースコントローラーを使用していますか? これを使用し、OnActionExecuting メソッドをオーバーライドすると、共通のページ ロジックをすべて保持するための中心的な場所を確保するのに役立つことがわかりました。
基本的に次の 2 つのオプションがあります。
ViewModel を使用して、表示するメニュー項目を設定します。それらは、完全または部分的な任意のビューからアクセスできます。
厳密に型指定されたモデルの階層を作成し、メニュー項目を BaseModel のどこかに配置すると、すべての派生モデルに表示されます。
あなたが興味を持っているのは、非同期コントローラーまたは部分的なリクエストです。ASP.NET MVC には実装されていませんが、MVC Contribコミュニティ プロジェクトを確認できます。サポートされています。
これに加えて、RenderAction が MVC2 Beta に追加されました。
これを処理するには多くのオプションがありますが、アプリ全体を再構築する必要のない、非常に簡単な方法でこれを処理できることがわかりました。
ページ/パーシャルには適切に定義された ViewData.Model タイプがありますが、ビューには複数のページで再利用されるパーシャルが含まれているという同様の問題がありました。また、ViewDataDictionary も使用しないようにしています。
ただし、まさにあなたが説明したケースは、ViewDataDictionary エントリを使用したい正確なシナリオであることがわかりました。アプリケーション モデルに静的な Constants クラスを保持します。このクラスには、ViewData キーを含む定数の各型の内部クラスが含まれているため、これらの定数の文字列がどこにでも浮遊することはありません。
次に、Controller アクションは ViewData キーと他のページ内のパーシャルを設定し、そのキーの存在をチェックし、ViewData.Model の代わりにそれを使用します。必要な場所で部分的な作業を行い、ViewModel をきれいに保ちます。定数を使用することで、どこでも生の文字列を避けることができます。
ActionFilter を使用して、ViewData に必要なメニュー情報を設定します。クラスおよび/またはメソッドにのみ適用します(どこでも必要な場合は、基本コントローラークラスに適用する可能性があります)。ViewData からのデータへのアクセスを厳密に型指定する (後でストレージの場所を変更した場合に透過的にする) 拡張メソッドを Controller にいくつか作成します。
私は最近、同様のアプローチでブログ投稿を行いました (すべてのページにスポンサーのリストを表示する必要がありました)。正しい方向に向けるのに役立つかもしれません。