2013-03-03 138 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

您可以创建一个隐藏表单元素,将该表单标记为唯一。每次表单由服务器写入时,都会创建一个新的随机唯一值。提交表单时,让服务器检查标识符以前没有被使用过。

问题是,如果您想让用户按下并重新提交创建第二个条目,则无法分辨用户是否打算创建第二个副本。在这种情况下你可以做的是建立一个链接,它使用户使用同一个表单,但是新生成一个包含唯一标识符的隐藏表单元素。