为什么不实现'IsRefresh','IsBackPost'就像是'IsPostBack'?

The*_*ing 2 asp.net refresh

我可以看到,我自己和很多人在ASP.NET中这两个项目都遇到了麻烦...刷新按钮,后退按钮......(我看到很多人都去问过如何在浏览器中禁用这两个按钮..)

现在在页面中实现两个更多的布尔变量有什么问题(IsRefresh,IsPostBack)......如果这些问题可以被规避和实施,那对开发人员来说将是一笔巨大的资产......

当您回答时,如果您还可以在Web应用程序中包含您正在采取的步骤,以避免在有用的情况下重新发布(有时在数据库中).

谢谢

Jør*_*ode 5

实现两个额外的布尔属性的问题是,确实没有(可靠的)方法来区分Back/ Refresh触发请求.当点击这些按钮时,浏览器将:

  1. 如果允许,则显示缓存中的页面,或
  2. 再次执行完全相同的请求(可能要求用户先确认)

您正在遇到案例#2.当第二请求时,服务器将收到的确切因为它与原始请求做相同的请求的数据.因此,ASP.NET(和大多数其他框架)将处理请求,就像处理原始请求一样.有几种方法可以解决此问题:

  1. 更改您的缓存策略以允许浏览器重新显示先前请求的结果(可能解决Back问题,但不能解决Refresh).
  2. 添加一个隐藏字段(或其中的数据ViewState),其中包含预期回发的页面上的唯一值.然后添加一些数据结构以保留"已使用"值的列表,以及在执行任何关键操作之前测试重复项的逻辑.
  3. 使用发布/重定向/获取模式可确保POST请求永远不会在浏览器历史记录中结束.

解决方案#3很简单,几乎适用于所有情况.基本上,不是将结果/确认作为对"关键"回发的回复而返回,而是重定向到新的URL:

protected void btnCritical_Click(object sender, EventArgs e)
{
    DoSomethingThatShouldNotBeDoneTwice();
    Response.Redirect("confirmation.aspx");
}
Run Code Online (Sandbox Code Playgroud)