Razorでの暗黙的なコードナゲットの埋め込み方法
Razorは、独自の言語を使用しません。Razorコードナゲット内に書くコードは、標準のC#またはVBになります。これにより、既存の言語スキルを再利用でき、独自の言語文法を習得する必要がなくなります。
Razorパーサーにはスマートビルドがあるので、C#/VBコードナゲットの終了を明示的に示す必要がありません。これにより、コーディングがよりスムーズで生産性のあるものになり、クリーンで簡潔なよいテンプレート文法で記述できます。以下はRazorがサポートするいくつかのシナリオで、コードナゲットの開始/終了を明示的に示さず、Razorに暗黙的にコードナゲットの領域を確認させる場合のものです。
プロパティへのアクセス
Razorでは、『ドット』表記を通じて参照される変数の値または変数上のサブプロパティを出力できます。
複数の下位レベルにあるサブプロパティにアクセスする時も、『ドット』表記が使用できます。
Array/Collectionの索引付け
Razorでは、CollectionまたはArrayに索引が付けられます。
メソッドの呼び出し
Razorでは、メソッドを呼び出せます。
上記のシナリオすべてにおいて、コードナゲットを明示的に終了させる必要がないことを確認してください。Razorは、コードブロックの終了を暗黙的に確認できています。
コードナゲットに対するRazorのパースアルゴリズム
以下のアルゴリズムは、Razor内で『@』式をサポートし、上記の暗黙的なコードナゲットを可能にするために使用するコアのパースロジックです。
- 識別子をパース。C#またはVB識別子で有効でない文字を確認すると、すぐに停止し、ステップ2に移ります。
- カッコの確認。"("また"["があると、ステップ2.1へ、それ以外はステップ3に移ります。
- 2.1. ")"また"]"にマッチするまでパースします(ネストされた"()"および"[]"ペアは追跡し、文字列やコメントで見つけた"()[]"は無視します)。
- 2.2. ステップ2にもどります。
- "."をチェック。もし1つあれば、ステップ3.1へ、それ以外は"."をコードとして受け入れず、ステップ4へ移ります。
- 3.1. もし"."の後の文字が有効な識別子な場合、"."を受け入れてステップ1に戻り、それ以外はステップ4に移ります。
- 完了!
コードとコンテンツの識別
ステップ 3.1は、特に上記のアルゴリズムの中で興味深く、識別子がコードステートメントの一部として使用される場合、またそれが静的なコンテンツとして扱われるべき場合のシナリオを、Razorが識別できるようになっています。
上記のスニペットで、「?」や「!」文字をコードナゲットの最後で使用している様子を確認してください。これらはどちらも正式なC#の識別子ですが、Razorはその後に空白文字が続いているので、暗黙的にそれらをコード式の一部ではなく、静的な文字列として扱うべきであることを認識できるのです。これは非常に便利で、キーストロークを減らすことができます。
Razorの明示的コードナゲット
Razorでは、多くのコードナゲットのシナリオを暗黙的に確認できます。しかしながら、コードナゲット式の領域によっては、より明示的にしたい/する必要がある場合も、やはりあります。@(式)文法で、これを行えます。
@()文法内には、必要なC#/VBコードステートメントが書けます。Razorでは、ラップする()文字を、コードナゲットステートメントの明示的領域として扱います。以下は、明示的コードナゲット機能を使用する場合のシナリオになります。
演算/修正の実行
明示的コードナゲットで演算が実行できます。
コード式の結果にテキストを追加
コードとして間違えてパースされないかどうかを心配することなく、コードナゲットの最後に静的なテキストを追加できる、明示的な式の文法があります。
上記では、<img>要素のsrc属性にコードナゲットを埋め込んでいます。これにより、『/Images/Beverages.jpg』のようなURLの画像とリンクできます。明示的な()がないと、RazorはCategoryName上の『.jpg』プロパティを探します(そして、エラーが発生します)。明示的にすることで、コードの終了とテキストの開始をはっきりと示すことができます。
ジェネリックとラムダ式の使用
明示的な式により、コード式でジェネリックの型およびメソッドが使用でき、タグ要素とややこしくならないように、ジェネリックの<>文字を避けられます。