今回は「プロンプト」を使って、ユーザーからの入力を受け取るメッセージを扱います。alert(表示のみ)やconfirm(OK/キャンセルの選択)と異なり、prompt はメッセージとともにテキスト入力欄を表示し、ユーザーが入力した文字列を戻り値として受け取ることができます。この仕組みを使い、「認証コードをメールで送信し、ユーザーがそれを入力して照合する」という認証シナリオを実装しながら解説していきます。
MessageBoxPrompt関数の追加
App.razorの<script>ブロックには、既存のMessageBoxAlert(アラート表示)とMessageBoxConfirm(確認ダイアログ)が定義されています。
図1 App.razorの既存のJavaScript関数(MessageBoxAlert・MessageBoxConfirm)
このMessageBoxConfirm関数をコピー&貼り付けして複製します。
図2 MessageBoxConfirm関数をコピー&貼り付けして複製
複製した方の関数名をMessageBoxPromptに変更し、中身もconfirm(message)からprompt(message)に書き換えます。引数はmessageで同じですが、promptの戻り値はstringになる点がconfirm(bool)との違いです。
図3 関数名をMessageBoxPromptに変更し、prompt(message)を返すよう修正
function MessageBoxPrompt(message)
{
return prompt(message);
}
コード1 App.razorに追加したMessageBoxPrompt関数
Loginボタンの追加
続いてHome.razorに戻り、ボタンを1つ追加します。既存の保存ボタンのdivをコピー&貼り付けし、Loginボタンとして書き換えます。onclick属性の値には「Login」と入力し(IntelliSenseの入力候補も表示されます)、表示テキストは「ログイン」とします。
図4 保存ボタンのdivをコピー&貼り付けし、onclick属性をLoginに変更(IntelliSense候補表示)
<div class="mb-3">
<button class="btn btn-primary" @onclick="Login">ログイン</button>
</div>
コード2 Home.razorに追加したLoginボタン
認証ボタンをイメージしており、Loginボタンを押すと認証コードをメールで送信し、「メールで送ったコードを入力してください」と促す、という流れをこのあと実装していきます。呼び出し先のLoginメソッドがまだ存在しないため、まずは空のメソッドを新規作成します。
図5 private void Login()の空メソッドを新規作成
プロンプトメッセージの表示と入力値の受け取り
作成したMessageBoxPromptを呼び出します。JS.InvokeAsyncは戻り値があるため、InvokeVoidAsyncではなくInvokeAsync<string>を使い、戻り値の型としてstringを指定します。第1引数にJavaScript側の関数名、第2引数にメッセージ文字列(「メールを送信しました。認証コードを入力してください。」)を渡します。JS呼び出しは非同期なので、メソッドをasync Task化してawaitで待ち受けます。
図6 private async Task Login()に変更し、JS.InvokeAsync<string>でMessageBoxPromptを呼び出す
戻り値のstringはinputCodeという変数で受け取るようにします。これで、プロンプトに入力された値がinputCodeに入ってくる流れになります。
図7 string inputCode = await JS.InvokeAsync<string>(…)で戻り値を受け取る
private async Task Login()
{
string inputCode = await JS.InvokeAsync<string>(
"MessageBoxPrompt",
"メールを送信しました。認証コードを入力してください。");
}
コード3 Home.razorのLoginメソッド(プロンプト表示・入力受け取り部分)
動作確認(プロンプトの表示と値の取得)
inputCodeの行にブレークポイントを置いた状態で一度実行してみます。ログインボタンを押すと、「メールを送信しました。認証コードを入力してください。」というメッセージとともに入力欄が表示されます。
図8 実行してログインボタンを押すと、プロンプトメッセージと入力欄が表示される
試しに「12344」と入力し、OKを押します。
図9 プロンプトの入力欄に「12344」と入力
ブレークポイントで停止し、inputCodeに入力した「12344」が正しく代入されていることが確認できます。このように、ユーザーに何かを入力させ、その値を受け取って次の処理に使う、ということができます。
図10 ブレークポイントでinputCodeに“12344”が代入されていることを確認
認証コードの生成とログ出力
今回のシナリオのように、認証コードを作ってメールで送信し、入力された値と一致するか検証する、という使い方もできます。まずRandomクラスをnewし、Random.Nextでランダムな数値を取得します。
図11 var random = new Random();と入力(IntelliSense候補表示)
6桁のランダムな数字を取るつもりでrandom.Next(100000, 100000)と入力していますが、この時点では最小値・最大値がどちらも100000になってしまっており、実は常に同じ値しか返らない誤りがあります(この誤りは後の手順で7桁の範囲に修正します)。
図12 int code = random.Next(100000, 100000);(この時点では誤りがあり、後で7桁の範囲に修正する)
本来はここで取得したcodeを実際にメール送信するロジックを入れるところですが、今回はSystem.Diagnostics.Debug.WriteLineでcode.ToString()を出力し、メール送信の代わりとします(ToString()を付けなくても分かりやすさのために付けているだけで、実際には不要です)。
図13 System.Diagnostics.Debug.WriteLineでcode.ToString()をログ出力(メール送信の代わり)
var random = new Random();
int code = random.Next(100000, 1000000);
//メール送信…
System.Diagnostics.Debug.WriteLine("code:" + code.ToString());
コード4 Home.razorに追加した認証コード生成とログ出力(最終的に7桁の範囲へ修正済み)
入力値との照合とエラーメッセージ
ユーザーがメールを見て入力してきたinputCodeが、code.ToString()と一致するかを検証します。一致しない場合はreturnで処理を抜けるようにし、その前にアラートメッセージで「認証失敗!!」と表示します。
図14 if (code.ToString() != inputCode) { 認証失敗のアラート表示; return; } を追加
if (code.ToString() != inputCode)
{
await JS.InvokeVoidAsync("MessageBoxAlert", "認証失敗!!");
return;
}
コード5 Home.razorに追加した認証チェックとエラーメッセージ
認証成功時の画面遷移
ここを通過した場合(認証が成功した場合)は、例えば別のページに移る、といったこともできます。まずHome.razorの先頭にNavigationManagerを@injectで宣言します。
図15 Home.razorの先頭に@inject NavigationManager NavigationManagerを追加
続いて、認証成功時の処理としてNavigationManager.NavigateToを呼び出し、例としてcounterページに遷移するようにします。
図16 認証成功時にNavigationManager.NavigateTo(“counter”)で画面遷移する処理を追加
@inject NavigationManager NavigationManager
コード6 Home.razorに追加したNavigationManagerのDI宣言
NavigationManager.NavigateTo("counter");
コード7 認証成功時に呼び出すページ遷移処理
7桁への修正と動作確認
ここで先ほどの誤り(6桁のつもりが最小値・最大値とも100000になっていた点)に気づき、random.Next(100000, 1000000)に修正して7桁のランダムな数値が生成されるようにします。
図17 random.Next(100000, 1000000)に修正し、7桁のランダムな数値が生成されるようにする
この状態で実行し、ログインボタンを押すと「認証コードを入力してください」のプロンプトが表示されます。出力ウィンドウを見ると、ランダムな値がログに出力されており、実際にはこれがメールで届いているという想定です。
図18 出力ウィンドウにログ出力されたランダムな認証コード(code:866429)を確認
この値をプロンプトに入力してOKを押すと、正しく認証が成功し、Counterページに画面遷移することが確認できます。
図19 正しい認証コードを入力すると認証が成功し、Counterページに遷移する
続けて、再度ログインボタンを押し、今度は適当な6桁の値を入力して認証してみると、「認証失敗!!」というメッセージが表示されることも確認できます。
図20 誤った認証コードを入力すると「認証失敗!!」のメッセージが表示される
まとめ
このように、prompt を使うとユーザーに何かを入力させ、その値を受け取って処理を進めることができます。今回のシナリオのように、認証コードを生成してメール等で送信し、ユーザーが入力した値と照合する、といった使い方ができるので、ぜひ活用してみてください。
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る
A01_はじめに
B01_メッセージを出すレイアウトの作成
B02_pタグを使ったメッセージ表示
B03_ポップアップメッセージを表示する方法
B04_問い合わせメッセージを表示する方法
B05_ユーザーの入力を受けるメッセージ
B06_インラインJavaScript非推奨
B07_Javascriptを分離してアクセスする方法
B08_MessageServiceを作成する
B09_自作Serviceの依存性注入をする方法
C01_EditFormを使った入力検証
C02_ValidationSummary
C03_ValidationMessage
C04_入力コンポーネント_InputText
C05_InputNumber
C06_未入力を許容する方法
C07_InputNumberで対応している型
C08_InputDate
C09_InputSelect
C10_入力コンポーネント_InputCheckbox
C11_InputRadioとInputRadioGroup
C12_InputTextArea
C13_InputFile
C14_ファイルの上限を設定する
C15_フォーカスをあてる方法_標準編_ElementReference
C16_フォーカスをあてる方法_Razorコンポーネント編
D01_StringLength
D02_RegularExpression_正規表現
D03_EmailAddress
D04_Compare
D05_ViewModelに分ける方法
D06_依存性注入を利用したViewModelの生成
D07_CustomValidation1
D08_CustomValidation2
D09_プロパティレベルのCustomValidation
D10_ValidationContext
D11_処理をViewModelに移す書き方
D12_ViewModelに移せないロジック
D14_ShouldRender
D15_ViewModelに書かないほうがいいもの
D16_エラー箇所にフォーカスを当てる方法
E01_Azureにデプロイするための事前作業
E02_Azureにアップするアプリの作成
E03_Azureへの公開準備
E04_Azureへの公開
E05_データベースの作成
E06_データベースのデータを取得する
E07_データベースの値を画面に表示する
E08_Azureのデータベースを作成する
E09_Azureのデータベースにポータルサイトからログインする
E10_AzureのDBにテーブルを作成する
E11_BlazorアプリからAzureDBに接続する
E12_SQLデータベース料金の注意
E13_AzureSQLデータベースの無料オファーを受ける
F01_依存性注入のライフサイクル
F02_クラウドでのAddSingletonの動き
■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る