【问题标题】:Hot to update Postback data directly using ViewState or some other method to clear hidden field?直接使用 ViewState 或其他方法清除隐藏字段来更新 Postback 数据?
【发布时间】:2019-08-20 19:41:06
【问题描述】:

我有一个隐藏字段,用于存储在页面上单击按钮时要更新的一些项目 ID。这工作正常。但是,如果用户单击更新按钮,然后等待页面重新加载,然后手动刷新页面(使用浏览器刷新按钮),则重新提交数据并在数据库中创建重复数据。

有没有办法清除回发数据中的隐藏字段,这样如果用户手动刷新页面,隐藏字段将为空,并且不会对数据库进行更新?

到目前为止,我已经尝试在数据库更新后使用下面的代码手动更新 ViewState。

ViewState["hdnBulkIds"] = "";

我还尝试从 ViewState 中排除隐藏字段,并在页面加载时使用 jQuery 手动清除它。

$( document ).ready(function() {
    $('#<%= hdnBulkIds.ClientID %>').val("");
});

在这两种情况下,我似乎都无法更新手动页面刷新时发送到服务器的数据“实例”,因此隐藏字段保留了原始按钮单击时的原始值。

我想问题可以简化为:有没有办法直接使用 ViewState 或其他方法来更新 Postback 数据以清除隐藏字段?

【问题讨论】:

    标签: javascript c# jquery postback viewstate


    【解决方案1】:

    这是一般网络表单的一个大问题,也是您应该考虑跳槽到 MVC 的一个重要原因。通过网络表单可能有一种优雅的方式来处理这个问题,但我不知道。

    一旦用户提交了一个表单,浏览器就会“记住”该提交,并且刷新将重新提交它。对此您无能为力,您必须通过其他方式检测第二次提交。

    您最好/最真实的解决方案是在您获取所有数据后进行重定向,并使用您的查询参数将页面重新构建为所需的状态。然后当用户刷新屏幕时将重新提交重定向而不是表单提交。

    Page.Redirect() 或类似的东西是允许您进行重定向的函数。麻烦的是,页面重定向会删除所有关于页面维护的 webforms 状态,你必须重新构建它。

    您还可以实现某种“CSRF”令牌样式系统。生成一个随机数并将其存储在页面加载时的用户会话中。当用户回帖时,以某种方式使该号码无效。这样,如果他们再次使用该号码回发,您可以取消请求。

    这是一种很老套的处理方式,据我所知,进行重定向是“久经考验”的方法。

    另一个选项是,如果回发编辑了一个值,请检查重复项,或者如果该值已被编辑并且如果有重复项,则不要让用户重复提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多