しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET MVC 3 の Razor ビューエンジンでちょっとイケてない点

イケてないといっても ASPX と比べると全然イケてるんですけどね。

例えば、if や foreach を書いた時の以下のような挙動。

@foreach (var item in collection)
{
    // ここはコードブロック扱いになる
    // C# として評価されてなくないときには <text></text> か HTML タグで括る
    <text>普通のテキスト</text>
}

個人的には <text> といった似非 HTML タグを持ち込むのは混乱のもとだと思うのですが…。コードブロック扱いではなくテキストブロック扱いにして、C# コードを書きたいときには @{ } や @〜 で書くようにすればいいと思ったり。

Razor 内で foreach などを使ってデータ処理などを行うのではなく、そういった処理はコントローラ部分であらかじめやっておくべきだと思うので、この挙動は何となく納得がいってません。

そしてもう一つは _ViewStart.cshtml の名前の付け方ですね。これは完全に個人的な考えなんですけど。

デフォルトのプロジェクトでは Shared 内にある _Layout.cshtml などはアンダースコアから始まっています。共通して使うものなので、名前の衝突を防ぐためにこのような名前付けになってるのは納得がいきます。

じゃあ、何故 Error.cshtml はアンダースコアが付いていないのか??いや、わかってるんです。HandleError のデフォルトビュー名が Error になっていて、コントローラ毎に Error.cshtml を用意すればオーバーライド出来るようになっているってことは。

でも、私的には非常に気持ちが悪いので HandleError のデフォルトビュー名を変更しちゃいます。MVC 3 からはグローバルフィルタが使えるので非常に便利ですね。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute { View = "_Error" });
}

これだけでデフォルトビュー名を変更できます。普通はコントローラ毎にエラーページを変更とかしないと思うんですが、変えたいときには HandleError をコントローラに追加して、View プロパティを変更すれば良いですね。