ここからはCounter画面の解説をしていきます。Counterはボタンを押すたびにカウントアップされていくだけのシンプルな画面ですが、その前提としてRazorコンポーネントについて説明しておきます。
図1 サンプルアプリのHome画面
図2 Counter画面。ボタンをクリックするとCurrent countがカウントアップされる
.razorという拡張子
Counter画面は「Counter.razor」というファイルで作られています。基本的にこの.razorという拡張子が付いたファイルが画面、つまりページ一つ一つに対応しています。
ソリューションエクスプローラーのPagesフォルダーを見ると、Counter.razor、Error.razor、Home.razor、Weather.razorといった具合に、画面ごとに.razorファイルが分かれていることが確認できます。
図3 Pagesフォルダー配下に並ぶ.razorファイル群
Razorコンポーネントとは
この.razorファイルはRazorコンポーネントと呼ばれるもので、C#とHTMLを統合するための仕組みです。1つのファイルの中にHTMLも書けるし、C#も書けるようになっています。
画面のレイアウトはHTMLで組み立てます。Counter.razorを見ると、見出しやボタンといった画面の構成要素はHTMLで記述されています。そのうえで、HTMLで組み立てたレイアウトに対して、データバインドを行ったり、ボタンのクリックイベントを拾ったりする処理はC#で書きます。
図4 Counter.razorの全体。HTML部分と@codeブロック(C#コード)で構成されている
Counter.razorの内容は以下のようになっています。
@page "/counter"
@rendermode InteractiveServer
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">
Click me
</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
h1タグやpタグ、buttonタグといった部分はHTMLそのものです。@currentCountのように@を付けることでC#側の変数を画面に埋め込むデータバインドができ、@onclick=”IncrementCount”のようにイベントとC#のメソッドを結び付けることができます。そして@codeブロックの中に、currentCountというフィールドや、それをインクリメントするIncrementCountメソッドといったC#のロジックを書いていきます。
JavaScriptがほぼ不要になる
本来Webアプリの開発ではJavaScriptで書く必要があるような処理も、Razorコンポーネントを使えばC#で書くことができます。そのため、JavaScriptの知識はほぼ最低限で済み、代わりにC#の知識を活かして開発を進めることができます。
WPF・XAMLとの共通点
画面の組み立てをHTMLで行い、ロジックをC#で書くという構造は、WPFで画面をXAMLで組み立て、ロジックをC#で書く感覚と同じです。そのため、勉強する内容としてはHTMLをきちんと覚える必要がある一方、C#の文法知識自体は普通に必要になる、という位置づけになります。
必要なHTMLの知識については、以降のレクチャーの中で解説していくので、現時点でHTMLの知識がなくても問題ありません。画面(UI)の組み立てはHTMLで行い、データバインドやイベントの取得、変数の宣言といった処理はこれまで通りC#で行うという感覚で進めていきます。
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を適応する