前回に続き、単方向データバインドについてもう少し詳しく見ていきます。今回はCounter.razorに変数を自分で追加しながら、@の役割や、テキストと式を組み合わせるときの注意点を実際に手を動かして確認していきます。
変数を使ったデータバインド
まずは@codeブロックに文字列型のフィールドを追加します。
private string _value = "AAABBB";
これをHTML側でそのまま _value と書くと、Razorはこれをただの文字として扱うため、画面には「_value」という文字列がそのまま表示されてしまいます。
図1 @を付けずに_valueと書いた場合のコード
図2 文字列「_value」がそのまま表示される
先頭に @ を付けることで、続く部分がC#のコードであると認識されるようになります。@_value と書き直すと、変数の値であるAAABBBが表示されます。
図3 @_value と記述したコード
図4 変数の値AAABBBが表示される
改行と段落
@_value をそのまま直書きすると改行されずボタンと横並びになってしまいます。HTMLで改行したい場合は <br /> を使います。
<br />
図5 <br /> を追加したコード
図6 <br /> により改行される
また、以前解説した通り、pタグで囲むとひとつの段落として改行してくれます。
<p>@_value</p>
図7 pタグで囲んだコード
図8 pタグにより段落として改行される
C#コードを直接埋め込む
変数だけでなく、@ の後ろに DateTime.Now のようなC#のコードを直接書くこともできます。
<p>@DateTime.Now</p>
図9 @DateTime.Now と記述したコード
図10 現在の日時が表示される
@ の後ろはC#コードとして認識されるので、ToStringによる書式指定も普通に行えます。
<p>@DateTime.Now.ToString("yyyy/MM/dd")</p>
ただし、いつもの癖でここにセミコロンを付けてしまうと、それも文字列の一部とみなされ、画面にそのままセミコロンが表示されてしまうので注意が必要です。
図11 誤ってセミコロンを付けたコード
図12 「2024/11/23;」のようにセミコロンがそのまま表示される
式を続けて書く
@_value と @DateTime.Now のように、式を続けて書くこともできます。
<p>@_value@DateTime.Now</p>
図13 2つの式を続けて記述したコード
図14 AAABBBと日時が続けて表示される
文字列の直後に@を書くときの注意点
「今の時間は」という文字列の直後にスペースを空けずに @DateTime.Now を書くと、Razorはこれを文字列の続きと判断してしまい、@DateTime.Now の部分がC#コードとして評価されず、そのままの文字列として表示されてしまいます。
<p>今の時間は@DateTime.Now</p>
図15 文字列に直接@DateTime.Nowを続けたコード
図16 「今の時間は@DateTime.Now」がそのまま文字列として表示される
これを解決するには2つの方法があります。ひとつ目は、半角スペースを空けて @ + 値であることを認識させる方法です。
<p>今の時間は @DateTime.Now</p>
図17 半角スペースを空けたコード
図18 正しく日時が評価されて表示される
半角スペースを空けたくない場合は、@ の後ろの値の部分を丸カッコで囲むことでも、データバインドされた値であると正しく認識させることができます。
<p>今の時間は@(DateTime.Now)</p>
図19 丸カッコで囲んだコード
図20 スペースなしでも正しく日時が評価されて表示される
プロパティ・メソッドを使ったデータバインド
@ の後ろに書けるのは変数やC#コードの直書きだけでなく、プロパティやメソッドも使用できます。まずプロパティの例です。
public string Value => "XXX";
これを @Value のようにHTML側で参照すると、変数のときと同様にプロパティの値(XXX)が表示されます。
図21 読み取り専用プロパティValueの定義
図22 @Value と記述して参照するコード
メソッドの場合も同様にデータバインドできます。メソッドなので、呼び出す際は引数を表すカッコが必要です。半角スペースを空けたくない場合は、これまでと同様に値の部分を丸カッコで囲みます。
public string GetString()
{
return "YYYYYY";
}
図23 文字列を返すGetStringメソッドの定義
図24 @(GetString()) と丸カッコで囲んで記述したコード
図25 これまでのすべての結果がブラウザに表示された状態
このように、単方向データバインドのポイントは「@ を付けるとその後ろがC#コードとして認識される」という点です。直接C#コードを書いてもよいですし、変数を使ってもよい、プロパティを使ってももちろんOKで、メソッドも同様に使うことができます。
A01_はじめに
A02_バージョンの確認
A03_プロジェクトの作成
A04_アプリの実行
A05_サンプルプログラムの構成
A06_Razorコンポーネント
A07_Razor構文
A08_@pageでURLを指定する
A09_@rendermode
A10_PageTitle
A11_HTMLの見出し
A12_pタグ
A13_単方向データバインド
A14_単方向データバインドの詳細
A15_Bootstrap
A16_ボタンクリックイベント
A17_イベント引数の受け取り方
A18_ここまでのまとめ
B01_新しいWebページを追加する方法
B02_サイドバーから画面を表示する
B03_サイドバーのアイコンを変更する方法
B04_計測値を表示する
B05_変数に置き換える
B06_最新の値でデータを更新する
B07_@usingで通常のC#コードを呼び出す
B08_画面遷移_aタグ
B09_画面遷移_aタグの見た目をボタンにする
B10_画面遷移_NavigationManagerでの遷移
B11_画面間のパラメータの受け渡し方法
B12_EscapeDataStringでエスケープする
B13_複数のパラメータを渡す
B14_任意のパラメータにする
B15_string以外の型をパラメータで使う方法
B16_DateTime型をパラメータで渡す方法
B17_引数2個のURLも型指定に変更する
B18_パラメータ属性をつけるときの注意点
B19_OnParametersSet
B20_OnInitialized
B21_OnInitializedが2回通る問題の対応
B22_ブラウザが開いている間の値を記憶する方法
B23_値の受け渡しとしてのProtectedSessionStorage
B24_非同期を想定したUIの制御
C01_一覧表示
C02_非同期での一覧表示
C03_table-striped
D01_入力エリア
D02_双方向データバインド
D03_入力データをリアルタイムで通知する方法
D04_placeholder
D05_入力エリアの横幅の調整
D06_テキストチェンジイベントを拾う方法
D07_プルダウン
D08_プルダウンのbootstrap
D09_プルダウンの選択している値をデータバインドで操作する
D10_プルダウンにリストの値を表示する
D11_プルダウンに未選択行を入れる
D12_プルダウンの入力を禁止する
D13_プルダウンのチェンジイベントを取得する
D14_チェックボックス
D15_チェックボックスにラベルを付ける
D16_複数のチェックボックスを並べる
D17_ラジオボタン
D18_ラジオボタンのデータバインド
D19_ラジオボタンのチェンジイベント
D20_ラジオボタンにbootstrapを適応する