直接使用 ViewState 或其他清除隐藏字段的方法直接更新回发数据?

Hot to update Postback data directly using ViewState or some other method to clear hidden field?

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

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

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

ViewState["hdnBulkIds"] = "";

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

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

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

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

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

一旦用户提交表单,浏览器 "remembers" 提交和刷新将重新提交。您对此无能为力,您必须通过其他方式检测第二次提交。

你的 best/most 真正的解决方案是在你获得所有数据后进行重定向,并使用你的查询参数重新构建页面所需的状态。然后当用户刷新屏幕,它将重新提交重定向而不是表单提交。

Page.Redirect() 或类似的东西是允许您进行重定向的函数。麻烦的是,页面重定向将清除网络表单维护的关于该页面的所有状态,您必须重建所有页面。

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

这是处理事情的一种 hackey 方式,据我所知,进行重定向是 "tried tested" 方法。

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