@rendermode InteractiveServer とは
Counter.razorの2行目に書かれている「@rendermode InteractiveServer」について解説します。これは、ユーザーが画面を操作したときにサーバーと通信するかどうかを指定する記述です。
図1 Counter.razorの2行目に@rendermode InteractiveServerと記述されている
画面が最初に表示されるときは、この記述の有無にかかわらずサーバーと通信して表示されます。問題になるのは、その後ボタンを押すなどのユーザー操作があったときです。ボタンを押して画面を更新するCounter画面のようなページでは、ユーザー操作をサーバーに伝えるために、必ずこの記述が必要になります。
動作確認:ボタンを押してカウントアップ
実際にCounter画面を開き、「Click me」ボタンを押すと、サーバーと通信してCurrent countの値が更新されていくことが確認できます。
図2 Counter画面。ボタンを押す前はCurrent count: 0
図3 ボタンを押すたびにサーバーと通信し、Current countが11に更新される
@rendermode を外すとどうなるか
試しに2行目の「@rendermode InteractiveServer」を削除してビルドし直してみます。
@page "/counter" <PageTitle>Counter</PageTitle>
図4 2行目の@rendermode InteractiveServerを削除してリビルド
この状態で画面を開くと、初期表示(Current count: 0)はされます。ところが「Click me」ボタンを押しても、サーバーと通信しないためCurrent countの値が更新されません。
図5 @rendermodeを外した状態でボタンを押しても、Current countは0のまま変化しない
つまり@rendermode InteractiveServerという記述がないと、初期表示はできてもユーザー操作をサーバーに伝えることができない、ということです。
記述を元に戻す
削除した行を元に戻してリビルドすると、再びボタン操作でサーバーと通信できるようになります。
@page "/counter" @rendermode InteractiveServer <PageTitle>Counter</PageTitle>
図6 @rendermode InteractiveServerを元に戻してリビルド
図7 記述を戻すと、ボタン操作でCurrent countが再び更新されるようになる
Interactivity locationとの関係
プロジェクトを新規作成する際に選択した「Interactivity location」の設定によって、この記述の要・不要が変わります。プロジェクト作成画面には、Per page/componentとGlobalの2つの選択肢がありました。
図8 プロジェクト作成時の追加情報画面。Interactivity locationの設定項目
図9 Interactivity locationのドロップダウン。Per page/componentとGlobalの2択
Globalを選んでおけば、各ページに@rendermode InteractiveServerを書く必要はなくなります。その代わり、常にサーバーとつなぎっぱなしの状態になるため、サーバーの負荷は上がります。
一方、Per page/component(本コースで選択している設定)を選んでおくと、ユーザー操作があるページだけに@rendermode InteractiveServerを書けばよく、通信が不要なページには書かない、という判断ができます。その分サーバーへの負荷を抑えられるため、基本的にはPer page/componentを選んでおく方がよいということになります。
記述が不要なページの例:Weather画面
Weather画面はデータの一覧をポンと表示するだけで、ユーザー操作を受け取る必要がないページです。そのため、Weather.razorには@rendermode InteractiveServerの記述がありません。
図10 Weather.razor。@attribute [StreamRendering]はあるが、@rendermodeの記述はない
このように、ユーザー操作を受け取って画面を更新する必要があるページにだけ@rendermode InteractiveServerを書く、というのがPer page/component設定における基本的な考え方です。
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を適応する