我们的ASP.NET页面上有一个带有一些数据的GridView,一列有CheckBoxes以便选择行。 GridView下方有一个删除按钮。当最终用户通过CheckBoxes选择某些项目然后单击“删除”按钮时,将触发回发,并删除所选项目。很常见的东西。
我被分配的问题也很常见。如果在结果页面上,最终用户单击浏览器后退按钮,则(在总是被忽略的警告之后)后回发重新启动。
这里的问题是,由于所选项目已被删除,浏览器只需选择现在占用已删除项目所在空间的任何行,然后继续删除这些项目。这是Bad Thing™。
到目前为止,我一直在围绕设置和检查Session变量的一些想法,试图跟踪是否发生了回发,但我对结果还不太满意。
有没有人有一个好的(希望很简单)处理这个问题的方法?
答案 0 :(得分:0)
如何在GridView中异步删除记录? (使用Updatepanel)
这将阻止浏览器在浏览器缓存中保存所选复选框,并在完全回发后用户刷新页面时删除烦人的安全弹出窗口浏览器。
或者有任何机会,您是否尝试在第一次绑定后取消选中代码隐藏中的所有复选框? (让我们在Page_Load上说)
试试这个:
<asp:UpdatePanel id="upGv" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="gv" runat="server" />
<asp:Button ID="btnDelete" runat="server" Text="Delete" />
</ContentTemplate>
</asp:UpdatePanel>
代码隐藏中的:
Private Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
' do a for loop searching for selected checkboxes and do the deleting here
' --- delete codes ---
' rebind the data in gridview
gv.DataSource = 'some dataset/datatable etc etc
gv.DataBind()
'update the updatepanel
upGv.Update()
End Sub
答案 1 :(得分:0)
我认为没有一种简单的方法。
您可以使用javascript并尝试各种http浏览器缓存设置,但您不能真正依赖它们。您必须假设用户将能够重新发布表单。
我认为你在服务器代码中处理它是正确的。怎么样:
在网格页面的GET中创建cookie /会话变量。 在网格页面的POST中使该cookie /会话变量无效。
这样,当通过后退按钮重新发布时,您的代码应检测到没有有效的cookie /会话值,然后可以重新发出重定向到同一页面强制GET。
PRG Pattern。
听起来你正在使用Post-Redirect-Get模式,因为你在回发中提到了“结果页面”。如果你不是,那么这有助于用户在发布的表格上按F5的另一个问题。
祝你好运!答案 2 :(得分:0)
您还可以在viewstate中添加一些值以及第一个会话!IsPostback然后将其更改为IsPostback中的其他内容。
这可能比cookie或浏览器缓存过期更容易。
在这种情况下,如果用户单击后退按钮并提交任何内容,您可以查看viewstate并查看它与会话中的值匹配,如果没有,则将用户永久性地驱逐。
这显然假设您正在使用启用了viewstate的传统asp.net。
希望这会有所帮助。