我有一些常规输入网页,用户可以在其中输入有关项目的一些详细信息。然后在用户按下提交按钮后,她被重定向到一个网页,说一切都很好。问题是,如果她单击后退按钮,那么输入页面会再次显示,如果她点击 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"/>
}