我试图找到解决我面临的ASP.NET应用程序(C#/ MySQL后端)问题的解决方案。
应用程序在多步向导中使用webforms将数据插入到SQL数据库中,各个步骤都是javascript驱动的,因此不能提交'完成直到最后一次'步。在某些情况下,无论如何,如果用户点击浏览器'返回'在最后一个'之后的按钮步骤重新提交表单,再次触发SQL INSERT,创建原始记录的dupes。
我尝试使用基于Ajax的机制来跟踪表单的步骤,直到向导到达最后一个'步。在那之后通过相同的Ajax函数,我将阻止重新提交表单以防止欺骗。
出于显而易见的原因,我不想使用javascript技巧来禁用后退按钮。
这个解决方案的主要问题是我不太喜欢它,而且实施起来也很困难,因为申请表上的向导非常明确,这可能会引起一些问题。
是否有最佳实践'在没有建立复杂基础设施的情况下防止此类问题?
我没有发布代码,因为我认为这会产生误导和不必要。
祝你好运, 麦克
答案 0 :(得分:0)
我找到了解决问题的方法。我认为对于面临同样问题的人来说,这可能是一个相当不错的做法。当然,这并不完美,但也许其他人可以将其改进为“完美解决方案”。
首先在页面的.aspx
代码中启动复制记录的表单我放置了这个:
<asp:LinkButton
ID="_btnForm1"
runat="server"
OnCommand="Link_Command"
CommandArgument='<%#Eval("id","~/Form1.aspx?id={0}&step=Exit")%>'>
Form1
</asp:LinkButton>
在后端代码中,我为Link_Button命令创建了一个hanlder:
protected void Link_Command(object sender, CommandEventArgs e)
{
Session["key"] = Guid.NewGuid().ToString().Replace("-", string.Empty);
Response.Redirect(e.CommandArgument.ToString());
}
简而言之,它会生成一个唯一的哈希码,将其存储为Session
值。
在管理记录的表单中,我检查了Session["key"]
值是否存在,而不是null
。如果密钥存在,代码没有到达它的关键部分,那么应该重新提交表单而不会出现问题。
当代码到达关键部分时(就在数据插入数据库之前),我清除了Session["key"]
值:
Session.Remove("key");
然后,如果用户尝试在关键部分之后重新提交表单,Session
密钥不再存在,代码可能会捕获“异常”并显示错误消息或重定向到其他页面:
if (Session["key"] == null)
{
Response.Redirect("Error.aspx?script=" + HttpUtility.UrlEncode(Request.Path));
}