Gridview,那个讨厌的浏览器后退按钮

时间:2011-11-07 16:49:58

标签: asp.net gridview postback

我们的ASP.NET页面上有一个带有一些数据的GridView,一列有CheckBoxes以便选择行。 GridView下方有一个删除按钮。当最终用户通过CheckBoxes选择某些项目然后单击“删除”按钮时,将触发回发,并删除所选项目。很常见的东西。

我被分配的问题也很常见。如果在结果页面上,最终用户单击浏览器后退按钮,则(在总是被忽略的警告之后)后回发重新启动。

这里的问题是,由于所选项目已被删除,浏览器只需选择现在占用已删除项目所在空间的任何行,然后继续删除这些项目。这是Bad Thing™。

到目前为止,我一直在围绕设置和检查Session变量的一些想法,试图跟踪是否发生了回发,但我对结果还不太满意。

有没有人有一个好的(希望很简单)处理这个问题的方法?

3 个答案:

答案 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。

希望这会有所帮助。