ユーザーがアイテムに関する詳細を入力する通常の入力Webページがあります。次に、ユーザーが送信ボタンを押すと、すべてが正常に行われたことを示すWebページにリダイレクトされます。問題は、戻るボタンをクリックすると入力ページが再度表示され、sumbitを押すとフォームが再送信され、別の項目がデータベースに書き込まれることです。これはもちろん望ましくありません。
C#でASP.NETMVCを使用しています。この状況に対処するためのベストプラクティスの方法は何ですか?
ユーザーがアイテムに関する詳細を入力する通常の入力Webページがあります。次に、ユーザーが送信ボタンを押すと、すべてが正常に行われたことを示すWebページにリダイレクトされます。問題は、戻るボタンをクリックすると入力ページが再度表示され、sumbitを押すとフォームが再送信され、別の項目がデータベースに書き込まれることです。これはもちろん望ましくありません。
C#でASP.NETMVCを使用しています。この状況に対処するためのベストプラクティスの方法は何ですか?
フォームを一意としてマークする非表示のフォーム要素を作成できます。サーバーによってフォームが書き込まれるたびに、新しいランダムな一意の値を作成します。フォームが送信されたら、その識別子が以前に使用されていないことをサーバーに確認させます。
問題は、ユーザーが 2 番目のエントリを作成するためにプッシュバックして再送信できるようにしたい場合、ユーザーが 2 番目のコピーを作成するつもりだったかどうかを判断する方法がないことです。この状況でできることは、ユーザーを同じフォームに移動させるリンクを作成することですが、一意の識別子を含む新しく生成された非表示のフォーム要素を使用します。
TempDate と非表示のフォーム値を使用して、一意のトークンを保存し、ポストバックでそれらを比較できます。
このような:
public ActionResult FormDemo()
{
var guid = Guid.NewGuid().ToString();
ViewData.Model = guid;
TempData.Add("guid", guid);
return View();
}
[HttpPost]
public ActionResult FormDemo(string name, string guid)
{
if(guid != (string)TempData["guid"]) return new HttpStatusCodeResult(500);
return RedirectToAction("FormDemoReceipt");
}
public ActionResult FormDemoReceipt()
{
return Content("Form submitted OK!");
}
私の FormDemo ビューは次のようになります。
@using (Html.BeginForm())
{
@Html.Hidden("guid", Model)
@Html.TextBox("name");
<input type="submit"/>
}