ようやく Razor を使ってビューを実装する段階までやってきました。しかし Razor は新しいビューエンジンですので、まずは基本的な文法を学んでいきましょう。
Razor の利点
Razor の基本的な考え方は "@" を識別子として HTML 内に C# コードを埋め込むことです。ASPX の <% %> コードナゲットに比べると非常に短く、そして "@" はタイプしやすい位置にあります。そして、ほぼそのまま C# コードを書くことが出来るので、ASPX の時のようにコードナゲットを大量に書く必要がなくなっています。
それでは具体的な例と ASPX との比較をしながら見ていきます。
HTML エスケープ埋め込み
ASPX
<%: Model.Name %>
Razor
@Model.Name
Razor では基本的に HTML エスケープしてから埋め込むようになっています。これは ASP.NET 4 で追加されたコードナゲットと同じですが、セキュリティリスクを低減するのに役立ちます。
HTML エスケープ無し埋め込み
ASPX
<%= Model.Name %>
Razor
@Html.Raw(Model.Name)
しかし、CMS など HTML タグを使いたい場合もありますので、その場合は Html.Raw ヘルパーメソッドを利用します。
条件分岐
ASPX
<% if (Model.Page > 1) { %> <span>text1</span> <% } else { %> text2 text3 <% } %>
Razor
@if (Model.Page > 1) { <span>text1</span> } else { <text>text2</text> @:text3 }
@ が頭についている以外は C# とまったく同じに見えますが、ここで注意しなくてはいけない点が一つ。Razor では { 〜 } ブロックの内部はコードブロック、つまり C# コードとして認識されるという点です。
しかし Razor のパーサは優秀なので内部に HTML タグ形式を発見すると、自動的にテキストとして扱うようになっています。このままだと if 文などのブロック内では HTML タグを付けないと静的な文字列を出力出来ないことになってしまうので、Razor では
ループ
ASPX
<% foreach (var item in collection) { %> <span><%: item %></span> <% } %>
Razor
@foreach (var item in collection) { <span>@item</span> }
C# と殆ど変わりませんが、for や foreach なども if と同様にコードブロックの扱いになりますので、静的な文字列を出力する場合には HTML タグや
コードブロック
ASPX
<% 〜 %>
Razor
@{ 〜 }
C# コードを書くためのブロックです。そのままでは HTML への出力は行われませんが、前述していますように HTML タグや
明示的にコード範囲を指定
Razor
<span>test@(Model.Name)test</span>
Razor のパーサは非常に賢いので、殆どの場合では正しく C# コードとそれ以外のテキストを判別することが出来ますが、どうしても正しく判別できないときがあります。
その場合は上記のように @(〜) 記法を使って明示的にコード範囲を指定することで解決できます。
サーバサイドコメント
ASPX
<%-- 〜 --%>
Razor
@* 〜 *@
HTML のコメントとは異なり、HTML 出力に含まれないコメントを書くことが出来ます。
まとめ
今回、紹介するにあたって条件分岐やループといったように具体的に書きましたが、実際には using や while など予約から始まる文の場合、頭に @ を付けるだけでそのまま書くことが出来ます。しかし、その場合でも { 〜 } ブロック内部はコードブロック扱いになりますので、テキストを出力する場合には注意が必要です。
Razor の基本的な文法は理解できたと思いますので、次回からはビューの細かい実装を行っていきたいと思います。お疲れ様でした。