前回までのレクチャーで、計測画面に計測値を表示するところまで作成しました。ただし、これまでの実装は単にランダムな値を生成して表示しているだけで、どこかのサーバーやデータベースと通信しているわけではありません。実際の開発では、外部と通信したりデータベースから値を取得したりする処理になることが多いはずです。
そこで今回は、これまでMeasureメソッドの中に直接書いていた処理を、別のC#のクラスに切り出して、そちらから値を取得するという形に書き換えます。これまではRazorページの中だけでコードを書いてきましたが、Razor構文からは通常のC#コードを普通に呼び出すことができます。今回はそのやり方を解説します。
Objectsフォルダーとクラスの作成
まず、C#のクラスを置くためのフォルダーを作成します。プロジェクトを右クリックして「追加」から「新しいフォルダー」を選択し、「Objects」(Objectに複数形のsを付けた名前)というフォルダーを作成します。
図1 ソリューションエクスプローラーに作成されたObjectsフォルダー
作成したObjectsフォルダーの中に、クラスを1つ追加します。クラス名は「MeasureService」としました。
図2 新しい項目の追加ダイアログでクラス名にMeasureServiceを指定
このMeasureServiceクラスの中で、これまで画面側で行っていた計測値を取得する処理を行うようにします。まずクラス自体をpublic staticにして、静的なクラスにしておきます。
図3 public static classとして定義
戻り値用のMeasureResultクラス
public static Measureメソッドを用意しますが、戻り値を計測値そのものにしたいので、そのための新しいクラスを作成します。クラス名はMeasureResultとしました。
図4 public static void Measure()とMeasureResultクラスの定義開始
MeasureResultクラスには、計測値を表すpublic float MeasureValueプロパティと、計測日時を表すpublic DateTime MeasureDateプロパティを用意します。
図5 MeasureResultクラスにMeasureValueプロパティを追加
続けて、MeasureメソッドのvoidをMeasureResultに変更し、計測結果を返却するメソッドに書き換えます。
図6 Measureメソッドの戻り値をMeasureResultに変更し、MeasureDateプロパティも追加
ランダム値生成処理の移動
画面側(MeasurePage.razor)にあったprivate Randomフィールドは、Ctrl+Xで切り取って、MeasureServiceクラスの中にprivate staticとして貼り付けます。
図7 _randomフィールドをMeasureServiceクラス内に移動
Measureメソッドの中では、var result = new MeasureResult();で新しいインスタンスを作成し、result.MeasureValueに_random.NextSingle()の値を入れます。
図8 result.MeasureValueに_random.NextSingle()を代入
同様にresult.MeasureDateにDateTime.Nowを入れ、最後にreturn result;で計測結果を返却するようにします。これで、これまで画面側でやっていたのと同じ、文字列への加工前のfloat値とDateTime値をMeasureResultに詰めて返却する処理が完成しました。
図9 完成したMeasureメソッド(result.MeasureDateの代入とreturn result;を追加)
完成したMeasureService.csの全体は次のとおりです。
namespace Ander99.Objects
{
public static class MeasureService
{
private static Random _random = new Random();
public static MeasureResult Measure()
{
var result = new MeasureResult();
result.MeasureValue = _random.NextSingle();
result.MeasureDate = DateTime.Now;
return result;
}
}
public class MeasureResult
{
public float MeasureValue { get; set; }
public DateTime MeasureDate { get; set; }
}
}
@usingでRazorページから参照する
画面側では、作成したMeasureServiceからMeasureResultを取得したいのですが、この時点ではまだMeasureServiceクラスの色が変わっておらず、正しく参照できていない状態です。MeasureService. と入力すると、IntelliSenseの候補にMeasureメソッドが表示されます。
図10 MeasureService.まで入力するとIntelliSenseの候補にMeasureが表示される
参照できていないクラス名にカーソルを合わせてCtrlを押しながら.(ドット)を押すと、クイックアクションのメニューが表示され、「@using Ander99.Objects」という候補が出てきます。これを選択します。
図11 クイックアクションに表示された「@using Ander99.Objects」を選択
これを選ぶと、ファイルの先頭にusing文が追加されます。通常のC#であればusingとだけ書きますが、Razor構文の中では先頭に@を付けて@usingと書き、その後ろに参照したいネームスペースを指定します。
図12 ファイル先頭に@using Ander99.Objectsが追加された状態
このネームスペースを参照することで、MeasureServiceクラスが見えるようになり、MeasureService.Measure()と書けばMeasureResultが返ってくるようになります。
図13 @using追加後、MeasureService.Measure()が正しく解決された状態
画面側のコードを置き換える
MeasureServiceからMeasureResultが取得できるようになったので、これまで画面側に直接書いていた_random.NextSingle()やDateTime.Nowといった記述は不要になります。それぞれ、取得したmeasureResultのMeasureValueプロパティ、MeasureDateプロパティに置き換えます。
図14 _random.NextSingle()やDateTime.Nowをmeasureresult.MeasureValue/MeasureDateに置き換えた最終形
この時点でのMeasurePage.razorの先頭部分と、書き換え後のMeasureメソッドは次のとおりです。
@page "/measure"
@using Ander99.Objects
@rendermode InteractiveServer
private void Measure()
{
var measureResult = MeasureService.Measure();
_measureValue = Math.Round(measureResult.MeasureValue, 2) + " m/s";
_measureDate =
measureResult.MeasureDate.ToString("yyyy/MM/dd HH:mss:ss");
}
実行して確認する
実行して「計測」ボタンを押すと、計測値と計測日時が表示されます。ただし、計測日時のフォーマット文字列に以前から残っていた誤字(本来HH:mm:ssとすべきところがHH:mss:ssになっていた)の影響で、「10:3608:08」のように表示が崩れてしまっています。
図15 「計測」ボタンをクリックした結果。日時フォーマットの誤字により表示が崩れている
フォーマット文字列をHH:mm:ssに修正します。
図16 フォーマット文字列をHH:mm:ssに修正
修正後に改めて「計測」ボタンを押すと、「2024/11/27 10:36:41」のように、計測日時が正しく表示されるようになりました。
図17 修正後、計測日時が正しく表示された実行結果
まとめ
今回のように、Razor構文の中からでも普通のC#のコードを呼び出すことができます。別のクラスに切り出したコードを参照する際は、先頭に@を付けて@usingと書き、その後ろに参照したいネームスペースを指定してください。
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を適応する