<%...%>, <%=...%>, <%#...%>などのASP.NET inline expressionについて

こんにちは、ショートスリーパーに憧れるエンジニアの糸賀です。

今回の主題はWeb Formsアプリケーション開発においての基礎であり、避けては通れない<% … %>, <%= … %>, <%# … %>などの記法についてご紹介します。これらは “inline expression”と呼ばれており、aspxやascxなどのファイル上にサーバー側の処理を記述するために使用されます。私がWeb Forms触りたての時は、これらすべて同じに見えました。

本当は下記以外の種類もあるのですが、今回は比較的よく使う場面が多く、かつ混同しやすい3種類を紹介します。

  • <% … %> – embedded code blocks
  • <%= … %> – displaying expression
  • <%# … %> – data-binding expression


調査対象のフレームワーク: Microsoft .NET Framework 4.5
最終更新日: 2021/5/30

<% … %> – embedded code blocks


これはembedded code blocksと呼ばれ、C#/VBで書かれたコードを実行できます。
例1のようにfor文やif文を用いたり関数を呼び出したりできます。
処理が実行されるのはレンダリングフェーズです。したがって、後に出てくるdata-binding expressionよりも後に処理されることになります。レンダリングフェーズとは何ぞやという方はWeb FormsのCLRについて調べてみてください。必要であれば別の機会に解説しようと思います。

例1

<% if (this.IsGeneralManager){ %>
	<p>トップシークレット情報</p></ br>
	<p>=== 社外秘 ===</p>
	<p>取締役会長の好きな食べ物はクロッフル</p>
	<p>=== 社外秘 ===</p>
<% } %>

<%= … %> – displaying expression


これはdisplaying expressionと呼ばれ、上で紹介したembedded code blocksの親戚です。例2のように、変数や定数の値を出力するために使われます。”…”に変数や定数を記述すると、その値がHTMLファイルに出力されます。embedded code blocksで<% Response.Write(…)%>のように記述する場合と同義です。つまり、例2と例3は同じ出力になります。
embedded code blocksを使用しているのとほぼ変わらないので、処理のタイミングはレンダリングフェーズです。

例2

<p style="display: <%= (this.IsGuest) ? "block" : "none" %>">
	新規登録をしてください。
</p>

例3

<p style="display: <% Response.Write((this.IsGuest) ? "block" : "none") %>">
	新規登録をしてください。
</p>

<%# … %> – data-binding expression


data-binding expressionと呼ばれており、DataBindメソッドの実行によりセットした値が反映されて出力されます。例4のIDが”trCredential”のWebコントロールのプロパティにaspx.csのプロパティ”this.IsSecretary”をセットしておきます。例5にあるように、コードビハインドでaspx.csのプロパティに値を代入します。一見、この時点で変更が反映されて、出力されたHTMLファイルに”this.IsSecretary”の値が出力されているように思えますがそうではありません。コントロール、またはPageのDataBind()を実行するまでは変更は反映されません。以上のことから、<%# … %>で記述された値はDataBindメソッドを実行して初めて値が反映されることをお忘れなく。
data-binding expressionは上で紹介したembedded code blocksと処理されるフェーズが異なります。embedded code blocksよりもコントロールがコンパイルされる前に実行されます。先ほどからなぜ各記法の説明に加えて、処理される順番も並行して説明しているかというと、注意が必要だからです。きちんと説明すると長くなるので今回は、例6のようにWebコントロールのプロパティにembedded code blocksを組み込めないことは覚えておいて下さい。これはそれぞれが処理されるフェーズが異なることから来ています。

例4

<tr ID="trCredential" Visible="<%# this.IsSecretary %>" runat="server">
	<td>
		トップシークレット情報</ br></ br>
		=== 社外秘 ===</ br>
		取締役会長の好きな食べ物はオッソブーコ</ br>
		=== 社外秘 ===</ br>
		トップシークレット情報</ br>
	</td>
</tr>

例5

// IsSecretaryプロパティに値を代入する
this.IsSecretary = false;
// DataBindメソッドを実行する
DataBind();
// または
trCredential.DataBind();

例6

<%-- 動かない --%>
<tr ID="trCredential" Visible="<%= false %>" runat="server">
	<td>
		トップシークレット情報</ br></ br>
		=== 社外秘 ===</ br>
		取締役会長の好きな食べ物はチャンボッタ</ br>
		=== 社外秘 ===</ br>
		トップシークレット情報</ br>
	</td>
</tr>

まとめ


<% … %>
embedded code blocksと呼ばれ、C#/VBで書かれたコードを実行できます。
<%= … %>
displaying expressionと呼ばれ、変数や定数の値を出力するために使われます。
<% Response.Write(“demo”) %> = <%= “demo” %>
<%# … %>
data-binding expressionと呼ばれ、DataBindメソッドの実行によりセットした値が反映されて出力されます。

参考文献

ASP.NET inline expressions in the .NET Framework
https://www.w2solution.co.jp/tech/wp-admin/post.php?post=7199&action=edit

関連記事

プロジェクトストーリー

おすすめ記事

技術

コメント

この記事へのコメントはありません。

カテゴリー

TOP
TOP