如何防止在重新提交表单时重新提交表单?
问题描述:
我有一些经常输入的网页,用户输入关于项目的一些细节。 然后,用户按下提交按钮后,她被重定向到一个网页,说一切都很顺利。问题是,如果她单击后退按钮,则输入页面将再次显示,如果她击中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"/>
}
+0
谢谢Arjan和Jodes – dsb 2013-03-03 20:36:27
答
您可以创建一个隐藏表单元素,将该表单标记为唯一。每次表单由服务器写入时,都会创建一个新的随机唯一值。提交表单时,让服务器检查标识符以前没有被使用过。
问题是,如果您想让用户按下并重新提交创建第二个条目,则无法分辨用户是否打算创建第二个副本。在这种情况下你可以做的是建立一个链接,它使用户使用同一个表单,但是新生成一个包含唯一标识符的隐藏表单元素。
的*唯一途径*安全地处理这是为了防止* *再加工两次提交的请求。在写入数据库之前检查数据库(在适当的事务中)。 – 2013-03-03 18:19:17
这是一个纯粹的用户错误。 – SLaks 2013-03-03 18:20:05