サーバー側のエラーは、投稿/リダイレクト/取得パターンでどのように処理されますか?

StackOverflow https://stackoverflow.com/questions/599086

  •  11-09-2019
  •  | 
  •  

質問

ユースケースを成功させるために、ポスト/リダイレクト/ゲット(PRG)ワークフローは非常に簡単です。目的のページにリダイレクト(クライアント側)。しかし、サーバー側の検証中にエラーが発生し、入力ページを再度表示するときに入力を保存する場合はどうでしょうか。

私が知る限り、2つのアプローチがあります。エラー中にフォーム投稿の提出(つまり、リダイレクトなし)の後に入力ページを再レンダリングするだけです(したがって、PRGパターンを無視します)。または、入力ページにリダイレクトし、以前の入力をレンダリング中に後で取得することができる場所(セッションなど)を保存します。どちらにも欠点があります。最初に、PRGパターンを避けるのに役立つ問題が発生します(例:ブックマーク性、二重提出)。 2番目のアプローチは一貫性のないGETにつながります(最初のGETは保存された入力を見つけ、その後のGETはそうではないかもしれません)。ここで言及されているものの他の選択肢はありますか?私は、このケースがどのように扱われるかについて、コミュニティからの意見を期待しています。

役に立ちましたか?

解決

私は通常、あなたが説明する最初の方法でそれを行います - 提出が成功した場合にのみリダイレクトします。無効なデータを含むフォームをブックマークするための実際のユースケースを見るのは困難です。一方、確認ページをブックマークすることはしばしば理にかなっています(送信が成功した後)。

他のヒント

フォームに記入するために使用されているURLがフォームの投稿のものである場合、問題はないと思います。入力が有効な場合は、リダイレクトして取得します。無効な場合は、埋め込まれたフォームを再表示します。これにより、相互作用は次のように見えます。

GET  /your-url => blank form
POST /your-url (success) => Redirect => GET /success-url
POST /your-url (failure) => filled-in form

上記のブックマーク性の問題は両方のアプローチに影響を与えています。サーバーに保存されている一時的なデータに依存しているものを実際にブックマークすることはできません。

また、検証が失敗した場合、データを保存しないことを確認しても、二重の提出は実際には問題ではありません(つまり、障害のあるデータが等程度の要求である)。

したがって、PRGは成功のみで非常にクリーンなアプローチです。

他の回答が言うように、サーバー側の検証を成功させるためにPost/Redirect/Get Patternのみを使用します。フォームが無効な場合は、エラーメッセージを使用して、応答に直接応答するだけです。

使いやすさのために、それを確認する必要があります クライアント側の検証は優れています, 、ユーザーはすぐにフィードバックを好むので、これはどんな方法でも良い考えです。 JavaScriptまたはを使用します 新しいHTML5フォーム機能, など required 属性または maxlength 属性または type="email" 属性など。

もちろん、 サーバー側の検証が必要です セキュリティのために、そして優雅な劣化のために。

ASP.NET MVCを使用している場合、投稿 - >故障状況に使用できる別の方法があります。この記事の#13で説明されています。 ASP.NET MVCベストプラクティス(パート1).

その方法を実装すると、できます いつも 投稿が失敗したとしても、投稿の後にリダイレクトしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top