【发布时间】:2010-03-24 20:37:53
【问题描述】:
为了防止重复请求(即在单击命令按钮后立即按 F5),我已将页面基类设置为在检测到重复请求时忽略该请求。
当我说“忽略”时,我的意思是 Response.End()
现在我想我以前见过这个工作,有问题的地方,我只是 Response.End() 而用户页面什么都不做。我不知道这在什么情况下起作用,但我现在无法重复。
现在当我调用 Response.End() 时,我只是得到一个空浏览器。更具体地说,我得到了这个 html。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8"></HEAD>
<BODY></BODY></HTML>
我设置了以下测试应用程序以确认问题不在我的应用程序的其他地方。这里是:
将以下内容添加到 aspx 表单中
<asp:Label ID="lbl" Text="0" runat="server" /><br />
<asp:Button ID="btnAdd1" Text="Add 1" runat="server" /><br />
<asp:Button ID="btnAdd2" Text="Add 2" runat="server" /><br />
<asp:Button ID="btnAdd3" Text="Add 3" runat="server" /><br />
这是文件背后的代码
using System;
namespace TestDupRequestCancellation
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
btnAdd1.Click += btnAdd1_Click;
btnAdd2.Click += btnAdd2_Click;
btnAdd3.Click += btnAdd3_Click;
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
CurrentValue = 0;
else if (Int32.Parse(lbl.Text) != CurrentValue)
Response.End();
}
protected void Page_PreRender(object sender, EventArgs e)
{
lbl.Text = CurrentValue.ToString();
}
protected int CurrentValue
{
get
{
return Int32.Parse(Session["CurrentValue"].ToString());
}
set
{
Session["CurrentValue"] = value.ToString();
}
}
void btnAdd3_Click(object sender, EventArgs e)
{
CurrentValue += 3;
}
void btnAdd2_Click(object sender, EventArgs e)
{
CurrentValue += 2;
}
void btnAdd1_Click(object sender, EventArgs e)
{
CurrentValue += 1;
}
}
}
当您加载页面时,单击任何按钮会执行预期操作,但如果您在按下其中一个按钮后的任何时间按 F5,它会将其检测为重复请求并调用 Response.End() 立即结束任务。这使用户的浏览器为空。
有没有办法让用户保持原样,以便他们只需单击一个按钮?
还有;请注意,这段代码是我能想出的最简单的代码来演示我的问题。这并不是为了演示如何检查 dup 请求。
编辑:另一个可以让我获得相同结果的更改是禁用我的所有事件处理程序。这可能吗?
【问题讨论】:
标签: asp.net webforms postback duplicates