我有一个隐藏的字段,用于存储单击页面上的按钮时要更新的一些项目ID。一切正常。但是,如果用户单击“更新”按钮,然后等待页面重新加载,然后手动刷新页面(使用浏览器的“刷新”按钮),则会重新提交数据并在数据库中创建重复数据。
有没有一种方法可以清除回发数据中的隐藏字段,以便如果用户确实刷新页面,则隐藏字段将为空,并且不会对数据库进行任何更新?
到目前为止,在数据库更新后,我尝试使用下面的代码手动更新ViewState。
ViewState["hdnBulkIds"] = "";
我还试图从ViewState中排除隐藏字段,并在页面加载时使用jQuery手动将其清除。
$( document ).ready(function() {
$('#<%= hdnBulkIds.ClientID %>').val("");
});
在这两种情况下,我似乎都无法更新手动刷新页面时发送到服务器的数据“实例”,因此隐藏字段保留了原始按钮单击后的原始值。
我想这个问题可以简化为:是否可以使用ViewState或其他方法清除隐藏字段来直接更新回发数据?
最佳答案
通常,这是Web表单的一个大问题,也是您应该考虑将其移植到MVC的一个重要原因。通过Web表单可能有一种优雅的方式来处理此问题,但我不知道有什么方法。
一旦用户提交了表单,浏览器就会“记住”该提交,刷新将重新提交它。您无能为力,您必须通过其他方式检测第二次提交。
最好/最正确的解决方案是在获取所有数据后进行重定向,并使用查询参数以需要的状态重新构建页面。然后,当用户刷新屏幕时,它将重新提交重定向而不是表单提交。
Page.Redirect()或类似内容是使您能够进行重定向的函数。麻烦的是,页面重定向将删除该页面维护的所有状态Webform,您必须重新构建所有状态。
您也许还可以实现某种“ CSRF”令牌样式系统。生成随机数,并在页面加载时将其存储在用户会话中。当用户发回邮件时,请以某种方式使该号码无效。这样,如果他们再次用该号码发回邮件,则可以取消该请求。
这是一种处理问题的方法,据我所知,进行重定向是“经过测试的”方法。
另一种选择是,如果回发编辑一个值,检查重复项或该值是否被编辑以及是否存在重复项,则不允许用户重复提交。