_ViewStartでDRY化
現在、「Index.cshtml」ファイルのトップに、使用するレイアウトファイルをプログラム的に設定しています。これは、レイアウトファイルが特定のビューによって変化する、ビュー特有のロジックがある場合は問題ありません。しかし、ほとんどのWebアプリケーションでは、全てのビューが同じレイアウトを使用していたり、異なるレイアウト(例えば、モバイルデバイスやローカライズされたサイトなど)ではあるが、全てのビューに渡り共通のものを拾うロジックになっているため、この方法で設定すると、冗長で重複的なものになってしまう可能性があります。
いいニュースですが、Razor(ASP.NET MVC 3ベータ版 リリースから開始)に新機能が加わり、各ビューで明示的にレイアウトを設定する必要性を省け、その代りにサイト上ですべてのビューに対して1つのレイアウトロジックが定義できるようになったので、ビューファイルをより一層クリーンで保守しやすくなります(そして、DRY原則、Don't Repeat Yourselfが守れます)。
ASP.NET MVC 3ベータ版リリースから始まったのですが、プロジェクトの「\Views」フォルダに、「_ViewStart.cshtml」(VBでは、_ViewStart.vbhtml)と呼ばれるファイルを追加できます。
「_ViewStart」ファイルは、各ビューの描画開始時に、実行したい共通のビューコードを定義するために使用できます。例えば、「_ViewStart.cshtml」ファイル内に、以下のようなコードを書いて、デフォルトで、「SiteLayout.cshtml」ファイルになるよう、レイアウトプロパティを、プログラム的に設定できます。
このコードは各ビューの開始時に実行されるため、個々のビューファイルにおいて、レイアウトを明示的に設定する必要はもうありません(ただし、上記のデフォルトの値をオーバーライドしたい場合は除く)。
重要:「_ViewStart.cshtml」によりコードが書けるようになるため、単純な基本プロパティセットではなく、オプションとして、よりリッチなレイアウト選択ロジックが可能になります。例えば、サイトにアクセスしているデバイスのタイプに応じて、レイアウトのテンプレートを変更し、電話またはタブレットには、各デバイスに最適化されたレイアウト、またPC/ラップトップには、デスクトップの最適化されたレイアウトを適用します。または、もしCMSシステムや共通の共有アプリケーションを構築している場合、サイトにアクセスしている顧客(または彼らの役割)に応じて、異なるレイアウトが選択できます。
これによってUIの柔軟性が向上します。またビューロジックがより簡単に書け、繰り返しの記述を防げます。
コントローラやアクションフィルタ内でもレイアウトを指定できます。もしそのままのレイアウト選択ロジックがよければ、そのままにもしておけます。