CodeZine(コードジン)

特集ページ一覧

ASP.NET MVC 3:Razorで暗黙的、明示的コードナゲット

連載:ScottGu's Blog翻訳

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2011/01/17 14:00

目次

Razorでの暗黙的なコードナゲットの埋め込み方法

 Razorは、独自の言語を使用しません。Razorコードナゲット内に書くコードは、標準のC#またはVBになります。これにより、既存の言語スキルを再利用でき、独自の言語文法を習得する必要がなくなります。

 Razorパーサーにはスマートビルドがあるので、C#/VBコードナゲットの終了を明示的に示す必要がありません。これにより、コーディングがよりスムーズで生産性のあるものになり、クリーンで簡潔なよいテンプレート文法で記述できます。以下はRazorがサポートするいくつかのシナリオで、コードナゲットの開始/終了を明示的に示さず、Razorに暗黙的にコードナゲットの領域を確認させる場合のものです。

プロパティへのアクセス

 Razorでは、『ドット』表記を通じて参照される変数の値または変数上のサブプロパティを出力できます。

caption

 複数の下位レベルにあるサブプロパティにアクセスする時も、『ドット』表記が使用できます。

caption

Array/Collectionの索引付け

 Razorでは、CollectionまたはArrayに索引が付けられます。

caption

メソッドの呼び出し

 Razorでは、メソッドを呼び出せます。

caption

 上記のシナリオすべてにおいて、コードナゲットを明示的に終了させる必要がないことを確認してください。Razorは、コードブロックの終了を暗黙的に確認できています。

コードナゲットに対するRazorのパースアルゴリズム

 以下のアルゴリズムは、Razor内で『@』式をサポートし、上記の暗黙的なコードナゲットを可能にするために使用するコアのパースロジックです。

  1. 識別子をパース。C#またはVB識別子で有効でない文字を確認すると、すぐに停止し、ステップ2に移ります。
  2. カッコの確認。"("また"["があると、ステップ2.1へ、それ以外はステップ3に移ります。
    • 2.1. ")"また"]"にマッチするまでパースします(ネストされた"()"および"[]"ペアは追跡し、文字列やコメントで見つけた"()[]"は無視します)。
    • 2.2. ステップ2にもどります。
  3.  "."をチェック。もし1つあれば、ステップ3.1へ、それ以外は"."をコードとして受け入れず、ステップ4へ移ります。
    • 3.1. もし"."の後の文字が有効な識別子な場合、"."を受け入れてステップ1に戻り、それ以外はステップ4に移ります。
  4. 完了!

コードとコンテンツの識別

 ステップ 3.1は、特に上記のアルゴリズムの中で興味深く、識別子がコードステートメントの一部として使用される場合、またそれが静的なコンテンツとして扱われるべき場合のシナリオを、Razorが識別できるようになっています。

caption

 上記のスニペットで、「?」や「!」文字をコードナゲットの最後で使用している様子を確認してください。これらはどちらも正式なC#の識別子ですが、Razorはその後に空白文字が続いているので、暗黙的にそれらをコード式の一部ではなく、静的な文字列として扱うべきであることを認識できるのです。これは非常に便利で、キーストロークを減らすことができます。

Razorの明示的コードナゲット

 Razorでは、多くのコードナゲットのシナリオを暗黙的に確認できます。しかしながら、コードナゲット式の領域によっては、より明示的にしたい/する必要がある場合も、やはりあります。@(式)文法で、これを行えます。

caption

 @()文法内には、必要なC#/VBコードステートメントが書けます。Razorでは、ラップする()文字を、コードナゲットステートメントの明示的領域として扱います。以下は、明示的コードナゲット機能を使用する場合のシナリオになります。

演算/修正の実行

 明示的コードナゲットで演算が実行できます。

caption

コード式の結果にテキストを追加

 コードとして間違えてパースされないかどうかを心配することなく、コードナゲットの最後に静的なテキストを追加できる、明示的な式の文法があります。

caption

 上記では、<img>要素のsrc属性にコードナゲットを埋め込んでいます。これにより、『/Images/Beverages.jpg』のようなURLの画像とリンクできます。明示的な()がないと、RazorはCategoryName上の『.jpg』プロパティを探します(そして、エラーが発生します)。明示的にすることで、コードの終了とテキストの開始をはっきりと示すことができます。

ジェネリックとラムダ式の使用

 明示的な式により、コード式でジェネリックの型およびメソッドが使用でき、タグ要素とややこしくならないように、ジェネリックの<>文字を避けられます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Scott Guthrie氏 Blog翻訳

もっと読む

著者プロフィール

  • WINGSプロジェクト Chica(チカ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5