2013-03-03 383 views
2

我有一些經常輸入的網頁,用戶輸入關於項目的一些細節。 然後,用戶按下提交按鈕後,她被重定向到一個網頁,說一切都很順利。問題是,如果她單擊後退按鈕,則輸入頁面將再次顯示,如果她擊中sumbit,表單將被重新提交,並且另一個項目正在寫入數據庫,當然這不可取。如何防止在重新提交表單時重新提交表單?

我在C#中使用ASP.NET MVC。處理這種情況的最佳實踐方法是什麼?

+0

的*唯一途徑*安全地處理這是爲了防止* *再加工兩次提交的請求。在寫入數據庫之前檢查數據庫(在適當的事務中)。 – 2013-03-03 18:19:17

+1

這是一個純粹的用戶錯誤。 – SLaks 2013-03-03 18:20:05

回答

0

您可以使用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"/> 
} 
+0

謝謝Arjan和Jodes – dsb 2013-03-03 20:36:27

2

您可以創建一個隱藏表單元素,將該表單標記爲唯一。每次表單由服務器寫入時,都會創建一個新的隨機唯一值。提交表單時,讓服務器檢查標識符以前沒有被使用過。

問題是,如果您想讓用戶按下並重新提交創建第二個條目,則無法分辨用戶是否打算創建第二個副本。在這種情況下你可以做的是建立一個鏈接,它使用戶使用同一個表單,但是新生成一個包含唯一標識符的隱藏表單元素。