0

快速的问题,我已经尝试自己解决这个问题,但是当试图弄清楚页面为什么或如何重新加载以及做/不做它应该做的事情时,会话变量的使用可能会令人困惑。

在任何(非脚本)情况下,页面重新加载(使用 JavaScript、f5、ctrl+f5、浏览器重新加载按钮等)是否会导致表单重新发布?

(这与在 C# 代码中使用 IfPost 分支有关,如下面的示例代码):

if(IsPost)
{
    //stuff that only executes if the previous request was a post.
}

我只是需要知道这里会发生什么,这样我才能正确诊断我的会话状态问题。

谢谢你的帮助!

(另外,对不起,如果我过度简化了这个问题。我意识到它“可能”比一个简单的答案所能提供的更复杂)。

** * ** *更新* ** * ** * ** * 另外,我在 StackOverflow 上查找了这个问题的副本,但我什么也没看到,所以如果这是一个重复的问题,我深表歉意。

这里的两个答案都是很好的答案。我接受了也为我的问题提供了解决方案的答案,虽然 PRG 不是“唯一”的方法,但它似乎可能是最好的。这似乎也是处理客户端用户友好性的一种日益增长的方式,而且恕我直言,这似乎是一个很好的习惯。

谢谢你给我看!

4

3 回答 3

5

是的。如果页面是使用 POST 数据加载的,则会发生这种情况。为了防止这种情况,您需要实现该POST/REDIRECT/GET模式

Post/Redirect/Get (PRG) 是一种 Web 开发设计模式,可以防止一些重复的表单提交,为用户代理(用户)创建更直观的界面。PRG 以可预测的方式支持书签和刷新按钮,不会创建重复的表单提交。

于 2012-12-14T18:00:13.680 回答
2

是的。如果有人手动刷新浏览器,它会询问他们是否要再次发送表单数据。这将导致该代码被执行。

于 2012-12-14T17:59:30.133 回答
0

处理此问题的一种方法是使用令牌。

  1. 发送一个随机字符串以及发布数据
  2. 将此随机字符串存储在某处
  3. 检查发布数据时,请确保存储的字符串与发布请求中的字符串相同。
  4. 如果为真,则处理请求。
  5. 生成新令牌

如果有人刷新并重新发送发布数据,您在发布请求中的令牌将不同于您单独存储的令牌,因为您在步骤 5 中生成了一个新令牌

于 2016-01-05T13:03:29.910 回答