我有一些經常輸入的網頁,用戶輸入關於項目的一些細節。 然後,用戶按下提交按鈕後,她被重定向到一個網頁,說一切都很順利。問題是,如果她單擊後退按鈕,則輸入頁面將再次顯示,如果她擊中sumbit,表單將被重新提交,並且另一個項目正在寫入數據庫,當然這不可取。如何防止在重新提交表單時重新提交表單?
我在C#中使用ASP.NET MVC。處理這種情況的最佳實踐方法是什麼?
我有一些經常輸入的網頁,用戶輸入關於項目的一些細節。 然後,用戶按下提交按鈕後,她被重定向到一個網頁,說一切都很順利。問題是,如果她單擊後退按鈕,則輸入頁面將再次顯示,如果她擊中sumbit,表單將被重新提交,並且另一個項目正在寫入數據庫,當然這不可取。如何防止在重新提交表單時重新提交表單?
我在C#中使用ASP.NET MVC。處理這種情況的最佳實踐方法是什麼?
您可以使用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"/>
}
謝謝Arjan和Jodes – dsb 2013-03-03 20:36:27
您可以創建一個隱藏表單元素,將該表單標記爲唯一。每次表單由服務器寫入時,都會創建一個新的隨機唯一值。提交表單時,讓服務器檢查標識符以前沒有被使用過。
問題是,如果您想讓用戶按下並重新提交創建第二個條目,則無法分辨用戶是否打算創建第二個副本。在這種情況下你可以做的是建立一個鏈接,它使用戶使用同一個表單,但是新生成一個包含唯一標識符的隱藏表單元素。
的*唯一途徑*安全地處理這是爲了防止* *再加工兩次提交的請求。在寫入數據庫之前檢查數據庫(在適當的事務中)。 – 2013-03-03 18:19:17
這是一個純粹的用戶錯誤。 – SLaks 2013-03-03 18:20:05