asp.net - 为什么不像 'IsRefresh' 一样实现 'IsBackPost' 、 'IsPostBack' ?

标签 asp.net refresh

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

现在在 Page 中实现另外两个 bool 变量(IsRefresh、IsPostBack)有什么问题...如果这些问题可以被规避并实现,这对开发人员来说将是一笔巨大的财富...

当您回答时,如果您还可以在网络应用程序中包含您正在采取的步骤,以避免在这种情况下重新发布(有时在数据库中),那将会很有帮助。

谢谢

最佳答案

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

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

您遇到的是情况#2。当第二个请求发生时,服务器将收到与原始请求完全相同的请求数据。因此,ASP.NET(以及大多数其他框架)将像处理原始请求一样处理该请求。有多种方法可以解决此问题:

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

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

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

关于asp.net - 为什么不像 'IsRefresh' 一样实现 'IsBackPost' 、 'IsPostBack' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2271380/

相关文章:

c# - ASP.Net MVC 图像上传通过缩小或填充调整大小

c# - onclick 第二次点击

PHP MySQL 获取结果已缓存,需要刷新页面。

Python 刷新 HTML 文档

jquery 移动更新 anchor 文本

c# - 无法为 UpdatePanel 中的触发器找到具有 ID 的控件

asp.net - 使用数据库托管 asp.net 网站

asp.net - 使用 JavaScript 从网格重定向是否会提高性能

python - 使用屏幕管理器更新 kivy 标签

c++ - 使用线程刷新opencv的问题