繁体   English   中英

ASP.NET防止浏览器“退回”

[英]ASP.NET prevent browser 'back'

我正在尝试找到针对ASP.NET应用程序(C#/ MySQL后端)所遇到问题的解决方案。

该应用程序在多步骤向导中使用webforms将数据插入SQL数据库中,各个步骤都是由javascript驱动的,因此只有在“最后”一步之前才完成“提交”。 无论如何,在某些情况下,如果用户在“最后一步”之后立即单击浏览器的“后退”按钮,则会重新提交表单,并再次触发SQL INSERT,从而创建原始记录的重复。

我努力使用基于Ajax的机制来跟踪表单的步骤,直到向导到达“最后一步”为止。 在那槽之后,相同的Ajax函数将阻止重新提交防止重复的表单。

由于明显的原因,我不想使用JavaScript技巧来禁用“后退”按钮。

该解决方案的主要问题是我不太喜欢它,而且由于申请表上的向导表达清楚,因此实施起来也非常困难,这可能会引起一些问题。

是否有“最佳实践”在不构建复杂基础架构的情况下预防此类问题?

我没有发布代码,因为我认为这会产生误导和不必要的作用。

最好的问候,迈克

我找到了解决问题的方法。 我认为这对于面临相同问题的人们来说可能是一个合理的好习惯。 当然,它不是完美的,但也许其他人可以将其完善为“完美解决方案”。

首先,在页面的.aspx代码中,启动要复制记录的表单,我将其放置在此位置:

<asp:LinkButton
    ID="_btnForm1"
    runat="server"
    OnCommand="Link_Command"
    CommandArgument='<%#Eval("id","~/Form1.aspx?id={0}&step=Exit")%>'>
    Form1
</asp:LinkButton>

在后端代码中,我为Link_Button命令创建了一个处理程序:

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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM