2

まず、いくつかのコンテキスト:

私のコントローラーでは、成功したHTTPPOSTでRedirectToActionを返します。TempDataを使用して、ユーザーが入力したモデルデータを保持し、リダイレクト先のメソッドがこの入力データを再び使用できるようにします。

例:1。検索フィールドにuserIDを入力します。2.ボタンをクリックすると、POSTが実行され、ユーザーは私のリポジトリを介してデータベースで検出され、userIDはTempDataに保存され、RedirectToAction( "Edit")を呼び出します。

TempData["user"] = searchViewModel.userID;
return RedirectToAction("Edit");
  1. 編集ビューで編集を実行し、コミットボタンをクリックします。ユーザー情報はTempDataに保存され、RedirectToAction( "Confirm");を呼び出します。
  2. 確認ビューで行われた変更を表示し、[確認]をクリックすると、最終的なHTTP POSTが実行され、リポジトリサービスを介して変更が行われます。

これはうまくいくようです。「../Edit/Confirm」と入力してアドレスバーのページにスキップしようとするユーザーを処理するために、Confirmメソッドに次のチェックを入れます。

if (TempData["editUserViewModel"] == null)
  return RedirectToActionPermanent("Edit");

これは、アドレスバーの入力を処理するための最良の方法ですか?また、TempData.Keep( "editUserViewModel")を実行して、更新が機能するようにします。これは更新を処理するための最良の方法ですか?

4

1 に答える 1

2

ステップ1から2に進むために、代わりにパラメーター化されたアクションを提案します。

  1. 検索フィールドにuserIDを入力します。
  2. ボタンをクリックすると、POSTが実行され、ユーザーは私のリポジトリを介してデータベースで見つかります
  3. 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. ユーザーが検索入力を入力し、[送信]をクリックします
  2. (1)の検索は、ビューを返すアクションメソッドにGETリクエストとして送信されます。
  3. (2)で返されるビューには、<form method="POST" action="/Users/StillNeedsConfirmationAction">追加の入力要素を含むが含まれています。これは、データの編集に使用されるフォームです。
  4. ユーザーは(3)のフォームビューにデータを入力し、[送信]をクリックします。
  5. UsersControllerのアクションメソッドStillNeedsConfirmationActionは、ビューモデルオブジェクトを使用したHTTPPOSTを受け入れます。ただし、リダイレクトするのではなく、アクションは単に別のビューを返し、同じビューモデルオブジェクトを渡します。
  6. (5)で返されるビューには、が含まれてい<form method="POST" action="/Users/ConfirmAndUpdateAction">ます。以前のPOSTフォームの各テキストボックスまたはその他のフォーム要素の非表示の入力をレンダリングします。
  7. ユーザーが2番目のフォームで[送信]をクリックして、フィールドを確認します
  8. UsersControllerのアクションメソッドConfirmAndUpdateActionは、他のPOSTアクションが行ったのと同じviewmodelオブジェクトを使用したHTTPPOSTを受け入れます。ただし、別のビューを返す代わりに、今回はデータをリポジトリに保存してリダイレクトします。
于 2012-07-12T19:04:36.300 に答える