前回までで、URLのパラメータとして計測画面に値を渡す方法を扱いました。今回はその応用として、複数のパラメータを同時に渡す方法と、URLに使えない特殊文字を含む値を渡すときの注意点を扱います。
なお、前回のコードでは行末にセミコロン(;)が付いていましたが、Razor構文では不要なので削除しておきます。
図1 書き換え前のMeasurePage.razor。@pageディレクティブは「/measure」と「/measure/{MeasureArea}」の2つのみで、パラメータは計測場所(MeasureArea)だけを受け取る状態
複数パラメータを受け取る
これまでは計測場所(MeasureArea)のみをURL経由で受け取っていましたが、今回は計測値(MeasureValue)も合わせて2つのパラメータを受け取れるようにします。
複数のパラメータをURLで受け取るには、@pageディレクティブに「/」で区切って中カッコ({ })で囲んだパラメータ名を必要な数だけ並べます。
図2 @page “/measure/{MeasureValue}/{MeasureArea}” のように、スラッシュでつないで中カッコのパラメータ名を並べて記述する
@page "/measure"
@page "/measure/{MeasureArea}"
@page "/measure/{MeasureValue}/{MeasureArea}"
あわせて、受け取ったMeasureValueの値を保持するためのプロパティを、MeasureAreaのときと同様に[Parameter]属性を付けて追加します。
図3 [Parameter]属性を付けたMeasureValueプロパティを追加する
[Parameter]
public string MeasureValue { get; set; } = "--";
[Parameter]
public string MeasureArea { get; set; } = "--";
最後に、画面表示側の計測値の行を、これまでのフィールド参照から、追加したMeasureValueプロパティの参照に書き換えます。
図4 計測値の表示を @MeasureValue にバインドし直す
<p>計測値:@MeasureValue</p> <p>計測日時:@_measureDate</p> <p>計測場所:@MeasureArea</p>
これで、アドレスバーに「/measure/123/宇都宮」のように入力すると、1番目の値がMeasureValueに、2番目の値がMeasureAreaに、それぞれ渡って表示されるようになります。
図5 /measure/123/宇都宮 にアクセスすると、計測値:123、計測場所:宇都宮 が表示される
Home画面側のリンクも、2つの引数を渡す形に書き換えて動作を確認します。1番目がMeasureValue、2番目がMeasureAreaに対応するので、href=”measure/123/立川”のように書けば、計測値が123、計測場所が立川として渡ります。
図6 Home.razorのリンクを href=”measure/123/立川” に書き換えて実行すると、計測値:123、計測場所:立川 が表示される
URLに使えない文字を渡すとエラーになる
ここまでは整数の計測値でしたが、実際には「123.45 m/s」のように単位や記号を含む値を渡したい場合があります。試しにそのままhref属性の中に書いてみます。
図7 href=”measure/123.45 m/s/立川” のように、単位付きの文字列をそのままURLに埋め込む
<a href="measure/123.45 m/s/立川">計測画面を開く 引数2個</a>
この状態で実行すると、画面がError: 404となり、正しく計測画面に遷移できません。
図8 実行するとError: 404となり、計測画面が表示されない
原因は、値の中に含まれる「/」(スラッシュ)です。ブラウザはURL中の「/」を区切り文字として解釈するため、「123.45 m/s」に含まれる「/」がURLの区切りだと誤認識されてしまいます。実際に、この「/」を取り除くと問題なく動作することからも、「/」が原因であることが確認できます。
そこで、「ここからここまでは1つの文字列であり、URLの区切りではない」ということをブラウザに伝える書き方(エスケープ)が必要になります。C#では、Uri.EscapeDataStringメソッドを使うことで、文字列中のURLに影響する特殊文字をエスケープできます。値の部分を@Uri.EscapeDataString(“…”)で囲むように書き換えます。
図9 href=”measure/@Uri.EscapeDataString(“123.45 m/s”)/立川” のように、値の部分をUri.EscapeDataStringで囲む
<a href="measure/@Uri.EscapeDataString("123.45 m/s")/立川">計測画面を開く 引数2個</a>
これで再度実行すると、アドレスバー上では「123.45 m/s」の空白やスラッシュが「%20」「%2F」のようにエスケープされた状態でURLに渡り、区切り文字と誤認識されることなく正しく計測画面に反映されます。
図10 実行すると、アドレスバーには123.45%20m%2Fsのようにエスケープされた文字列が表示され、計測値:123.45 m/s、計測場所:立川 が正しく表示される
このように、URLに影響を与えるような空白やスラッシュなどの特殊文字を含む値をパラメータとして渡す場合は、Uri.EscapeDataStringを使ってエスケープするようにしてください。
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を適応する