【问题标题】:Refreshing/Reloading side effect with ASP.net?使用 ASP.net 刷新/重新加载副作用?
【发布时间】:2009-08-21 07:15:00
【问题描述】:

我在 web 和 ASP.Net 开发方面相对较新,所以请耐心等待。在测试我们的网页的过程中,我注意到如果用户单击“刷新/重新加载”,并在“重新发送信息”对话框提示时单击“重试”,无论用户选择之前触发的最后一个事件是什么到“刷新”,随后将再次被解雇。
例如,我们有“上一个”和“下一个”导航按钮,允许用户浏览一系列问题。如果操作员点击“刷新/重新加载”,用户最后按下的导航按钮将再次触发。这实际上是有道理的,但最终的结果是用户最终进入了他以前查看的下一页或上一页。这种事情有解决办法吗?

【问题讨论】:

标签: asp.net postback


【解决方案1】:

这是由于您处理PostBacks 的方式所致。

需要一点背景:

网络是“无状态的”,这意味着从客户端到服务器的每个请求都独立于它之前的请求或它之后的请求。没有维护“状态”。如果您查看 HTTP 级别,它只是一个发送到服务器的文本 blob,上面写着“向我发送此信息”,然后服务器将其发回。没有“我是 3 分钟前在这里的同一个用户,我想从上次我们谈话时转到下一页”。

ASP.NET 解决这个问题的方法是使用 ViewState 和回发。每次单击 ASP.NET 按钮时,它实际上是在提交一个表单,该表单具有一个带有一堆编码数据的隐藏字段。该数据包含所有服务器需要“重建”页面状态的信息,因为它是最后一次。然后它可以执行“移动到下一页”并且该命令是有意义的。当 ASP.NET 将 HTML 发送回客户端时,它会使用新数据更新该隐藏字段,再次表示页面的状态,就像现在一样。并且下次点击任意按钮时,数据再次发送,页面再次重构,循环往复。

当用户点击“刷新”时,浏览器会询问他们是否要重新提交表单。他们正在重新提交与上一轮相同的数据。

对您的启示:

如果您尝试独立于 ASP.NET ViewState 跟踪有关用户的任何数据或他们正在执行的操作,则需要确保在每次页面处理时同步这些数据。

您可能希望在 ViewState 中保留“当前页面”:

ViewState.Add("CurrentPage", intCurrentPage);

因此,当您调用 MoveNext 事件处理程序时,您可以确定您正在相对于页面移动,因为它是最后一次发送到客户端。

【讨论】:

    【解决方案2】:

    您可以查看在 asp.net mvc 中更常用的 Post-Redirect-Get 模式。

    更多详情请见here

    【讨论】:

    • 这是一种减少实际表单重新提交的好方法,但我不确定将它用于高度有状态的 WebForms 应用程序中的每个请求是否是个好主意。这使应用程序范围内的请求数量增加了一倍。
    • OP 没有提到“高度状态”,这只是您的假设,除非他每秒有 >200 个请求,否则他的基础设施几乎不会注意到额外的往返行程。为了摆脱那些对话和重新提交的危险,额外的工作是值得的。
    • 如果你注意到 SO 使用了相同的技术。我在这里没有看到很多性能问题,它每秒被查找超过几次!
    • @redsquare 正如我所说,这项技术没有问题。只是讨论它是否是分页等常见问题的理想解决方案。
    • 问题出在 webforms...viewstate...etc
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2018-11-05
    • 2021-10-27
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多