Blazor01

BlazorでのWebアプリケーション開発手法1【C#】B17_引数2個のURLも型指定に変更する

前回までのレクチャーで、URLパラメーターに型を指定する書き方——@page ディレクティブに :float や :datetime のような型を付ける方法——を見てきました。3つの値を渡す「引数3個」のURL(@page “/measure/{MeasureValue:float?}/{MeasureDate:datetime?}/{MeasureArea?}”)ではすでに型指定を行っていましたが、2つの値を渡す「引数2個」のURL(@page “/measure/{MeasureValue}/{MeasureArea}”)は型指定がされないまま残っていました。

図1 MeasurePage.razorの@pageディレクティブ。3行目「引数2個」用の記述だけ型指定(:float)が付いていない

この状態のまま「引数2個」の画面遷移を試すとエラーになります。原因は、計測値を保持するMeasureValueプロパティの型をfloatに変更したにもかかわらず、対応する@pageディレクティブ側には型指定がなく、URL上の値が文字列としてそのままfloat型のプロパティへセットされようとするためです。実際にHomeページの「引数2個」リンク(href=”measure/@Uri.EscapeDataString(“123.45 m/s”)/立川”)をクリックすると、「InvalidCastException: Unable to cast object of type ‘System.String’ to type ‘System.Single’.」というエラー画面が表示されます。

図2 型不一致により表示されるエラー画面(System.StringをSystem.Singleにキャストできない旨のInvalidCastException)

この問題を解消するため、MeasurePage.razorの3行目の@pageディレクティブを、4行目と同じ要領でMeasureValueに「:float」の型指定を追加する形に書き換えます。

図3 3行目のMeasureValueに:floatを追加した後の@pageディレクティブ

@* @page "/measure" *@
@page "/measure/{MeasureArea}"
@page "/measure/{MeasureValue:float}/{MeasureArea}"
@page "/measure/{MeasureValue:float?}/{MeasureDate:datetime?}/{MeasureArea?}"

 

続けて、呼び出し側であるHome.razorの「引数2個」用リンクも修正します。これまでは @Uri.EscapeDataString(“123.45 m/s”) のように単位付きの文字列をそのままfloat型のパラメーターへ渡そうとしていたため、このままではキャストできません。該当行にはコードエディタ上も型不一致を示す警告アイコンが表示されます。

図4 修正前のHome.razor。「引数2個」リンクが単位付き文字列”123.45 m/s”をそのまま渡している

図5 型不一致を示す警告アイコンが行番号の左に表示されている

修正方法としては、floatに変換可能な値を持つ既存の変数(@_value など)をそのまま渡す方法と、”23.456″ のようにfloatへ変換可能な数値の文字列に直接書き換える方法の2通りが考えられます。今回はシンプルに、リンクのURL部分を数値文字列 “23.456” に書き換えます。

図6 「引数2個」リンクのURL部分を23.456に書き換えているところ

<a href="measure/23.456/立川">計測画面を開く 引数2個</a>

 

実行してHomeページを開くと、これまでどおり「計測画面を開く 引数2個」のリンクが表示されます。

図7 Homeページ。「引数2個」リンクをクリックする

このリンクをクリックすると、今度はエラーにならずに計測画面(/measure/23.456/立川)へ正しく遷移し、URLで指定した23.456が計測値としてそのまま画面に表示されることが確認できました。これで「引数2個」のURLについても、「引数3個」のURLと同様に型指定が反映され、正しく動作するようになりました。

図8 「引数2個」のURL経由で計測画面に遷移し、計測値:23.456が正しく表示された

BlazorでのWebアプリケーション開発手法1【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を適応する