TECH MEDIA

テックメディア


技術
ブログ

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

ASP.NET
目次
  1. 01|はじめに
  2. 02|<% … %> – embedded code blocks
  3. 03|<%= … %> – displaying expression
  4. 04|<%# … %> – data-binding expression
  5. 05|まとめ

1. はじめに

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

今回の主題は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

2. <% … %> – 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>
<% } %>

3. <%= … %> – 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>

4. <%# … %> – 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>

5. まとめ

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

参考文献

ASP.NET inline expressions in the .NET Framework

RECRUIT 採用情報

「eビジネスに関わる全ての人を幸せにする」
私達とともに新たな時代をつくりませんか?