前回のレクチャーでは、計測値(MeasureValue)をfloat型でパラメータ渡しする方法を学びました。今回はその応用として、計測日時(MeasureDate)をDateTime型でパラメータ渡しする方法を解説します。基本的なやり方は前回のfloat型のときと同じですが、DateTime型ならではの注意点があります。
1. MeasureDateプロパティをDateTime型に変更する
まずは開始時点のコードを確認します。MeasurePage.razorの@pageディレクティブにはすでにMeasureValueのfloat型指定(:float?)が入っており、MeasureDateはまだ型指定なしの状態です。
図1 変更前の@pageディレクティブ(MeasureDateはまだ型指定なし)
@codeブロック内のプロパティも、この時点ではMeasureDateはstring型のままです。
図2 変更前のMeasureDateプロパティ(string型)
MeasureDateプロパティの型をDateTimeに変更します。string型のときの初期値”–“はDateTime型にはそのまま使えないため、エラー(赤い波線)が表示されます。
図3 型をDateTimeに変更した直後。初期値がstringのままなのでエラーになる
初期値は DateTime.MinValue を入れておきます。IntelliSenseの候補からMinValueを選択します。
図4 DateTime.MinValueの入力(IntelliSense候補表示)
[Parameter]
public DateTime MeasureDate { get; set; } = DateTime.MinValue;
2. 呼び出し側(Home.razor)にDateTime型のフィールドを追加する
続けて呼び出し側です。float型のときと同様に、private フィールドとしてDateTime型の _datetime を用意し、DateTime.Now を初期値として入れておきます。これをパラメータとして渡す形にします。
図5 Home.razorに private DateTime _datetime = DateTime.Now; を追加
private float _value = 12.8f; private DateTime _datetime = DateTime.Now;
3. 「引数3つ」のリンクを書き換えて実行してみる
「引数3つ」のリンクの2つ目(計測日時の部分)を、ハードコーディングされた文字列から @_datetime に書き換えます。
図6 書き換え前のhref(日時部分はUri.EscapeDataStringで囲んだ固定文字列)
図7 @_datetime に置き換えた直後のhref
この状態でアプリを実行すると、Homeページには3つのリンクが表示されます。
図8 Homeページの実行画面。「引数3個」のリンクをクリックする
しかし「引数3個」のリンクをクリックすると、エラー(404)になってしまいます。
図9 「引数3個」リンククリック時のエラー(404)
エラーの原因
パラメータの型はDateTime型として指定しているものの、URL上では内部的に文字列に変換されてから渡されます。その際、DateTime型を既定のToString()で文字列化すると yyyy/MM/dd のようにスラッシュ(/)が含まれる書式になり、このスラッシュがURLのルーティングにおける区切り文字と衝突してしまうため、正しくルーティングされずエラーになります。
4. Uri.EscapeDataStringとToStringの書式指定で対応する
結局この場合も、float型のときと同じやり方で対応します。@Uri.EscapeDataString() で全体を囲み、その中で _datetime を ToString() してスラッシュを含まない書式に変換します。
まずは yyyy-MM-dd のように、区切り文字をスラッシュからハイフンに変えた書式を指定します。
図10 _datetime.ToString(“yyyy-MM-dd”) と入力していく途中経過
日付部分だけでなく、時刻部分(HH:mm:ss)まで含めた書式にし、Uri.EscapeDataString() の丸カッコを閉じます。
図11 完成形:Uri.EscapeDataString(_datetime.ToString(“yyyy-MM-dd HH:mm:ss”))
<a href="measure/@_value/@Uri.EscapeDataString(_datetime.ToString("yyyy-MM-dd HH:mm:ss"))/立川">計測画面を開く 引数3個</a>
あわせて、@pageディレクティブのURLパラメータ側にもfloat型のときと同じ要領でコロン区切りの型指定を追加し、MeasureDateにも :datetime? を付けておきます。
図12 @pageディレクティブにMeasureDate:datetime?を追加した状態
@page "/measure"
@page "/measure/{MeasureArea}"
@page "/measure/{MeasureValue}/{MeasureArea}"
@page "/measure/{MeasureValue:float?}/{MeasureDate:datetime?}/{MeasureArea?}"
最終的な@codeブロック側のプロパティ定義は次のとおりです。
図13 最終的なMeasureValue/MeasureDateプロパティ
[Parameter]
public float MeasureValue { get; set; } = 0f;
[Parameter]
public DateTime MeasureDate { get; set; } = DateTime.MinValue;
[Parameter]
public string MeasureArea { get; set; } = "--";
5. 動作確認
この状態で改めて「引数3個」のリンクから遷移すると、URLはハイフン区切りの日時文字列がエスケープされた形になり、エラーなく計測画面に遷移します。計測日時にも正しく値(2024/12/02 23:12:41など)が表示されることを確認できます。
図14 実行結果。計測日時が正しく表示される
まとめ
パラメータを型指定して受け渡しすることはできますが、内部的に渡す際はURL上では文字列になっているため、今回のDateTime型のスラッシュのように、そのままではうまくいかないケースが出てきます。そのようなときは、今回のようにUri.EscapeDataString()とToString()の書式指定を組み合わせて対応します。多少手間はかかりますが、エラーなく受け取れた時点で、そのプロパティに指定した型(今回であればDateTime型)の値が入っていることが保証されます。型を指定して安全に値を受け取りたい場合は、このような形で対応するとよいでしょう。
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を適応する