ステップ1から2に進むために、代わりにパラメーター化されたアクションを提案します。
- 検索フィールドにuserIDを入力します。
- ボタンをクリックすると、POSTが実行され、ユーザーは私のリポジトリを介してデータベースで見つかります
- RedirectToAction( "Edit"、new {UserId = foundUserId})を呼び出します
また、検索するときは、おそらくPOSTを実行するべきではありません。情報を探していて、それを変更しない場合、GETは問題ありません。これにより、POSTの代わりにGETを実行するため、tempdataを使用している最初の場所でPRGパターンが完全に回避されます。
確認に関しては、tempdataなしでこれを行う別の方法があります。確認アクションにリダイレクトする代わりに、POSTして、確認ビューモデルを返します。その2番目のPOSTの後でのみ、リポジトリにアクセスし、POSTの後にリダイレクトと最後にGetを使用してPRGパターンを終了します。
バンドエイドで確認できるように、ユーザーは確認アクションに対してどのタイプのGETも実行できないようにする必要があります。したがって、getをまったく許可しないでください。編集フォームから確認アクションにPOSTし、ビューを返し、そのビューから2番目のPOSTアクションメソッドにPOSTします。これらはすべて同じプロセスの一部であるため、プロセスが完了する(リポジトリが更新される)まで、リダイレクトや一時データを処理する必要はありません。
更新(コメントへの返信)
1.)SearchUser関数の[HttpPost]属性を削除した場合、ビューの検索ボタンはどのように呼び出すかを認識しますか?
検索ボタンは<form>
HTML要素内にネストされています。フォームのメソッドをGETに変更する必要があります。属性が存在しない場合は、POSTがデフォルトであると思います。検索ボタンは同じままですが、フォームはユーザーが入力した入力をHTTPPOSTではなくHTTPGETリクエストとして送信します。
<form method="GET">
...
<input type="submit" value="Search" />
</form>
2.)確認のためのリダイレクトの削除を明確にできますか?リダイレクトをPOSTに変更する方法を理解するのに問題があります
Web開発を始めたばかりの人にこれを説明するのは難しいですが、本質的に、すべてのリダイレクトは常にHTTPGETリクエストです。これが、ステートレスリクエスト間でデータを維持するためにデータをセッションに入れる必要がある理由です(tempdataはセッションを使用します)。
基本的に、ワークフローは次のとおりです。
- ユーザーが検索入力を入力し、[送信]をクリックします
- (1)の検索は、ビューを返すアクションメソッドにGETリクエストとして送信されます。
- (2)で返されるビューには、
<form method="POST" action="/Users/StillNeedsConfirmationAction">
追加の入力要素を含むが含まれています。これは、データの編集に使用されるフォームです。
- ユーザーは(3)のフォームビューにデータを入力し、[送信]をクリックします。
- UsersControllerのアクションメソッドStillNeedsConfirmationActionは、ビューモデルオブジェクトを使用したHTTPPOSTを受け入れます。ただし、リダイレクトするのではなく、アクションは単に別のビューを返し、同じビューモデルオブジェクトを渡します。
- (5)で返されるビューには、が含まれてい
<form method="POST" action="/Users/ConfirmAndUpdateAction">
ます。以前のPOSTフォームの各テキストボックスまたはその他のフォーム要素の非表示の入力をレンダリングします。
- ユーザーが2番目のフォームで[送信]をクリックして、フィールドを確認します
- UsersControllerのアクションメソッドConfirmAndUpdateActionは、他のPOSTアクションが行ったのと同じviewmodelオブジェクトを使用したHTTPPOSTを受け入れます。ただし、別のビューを返す代わりに、今回はデータをリポジトリに保存してリダイレクトします。