我有一个WebPage,我必须检测并阻止使用浏览器刷新按钮。 (现在请,不要建议我Response.Redirect,我不能在这种情况下使用它。)
在查看此页面http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh.4时,我找到了方法。我打算将这个想法放在一个控件中并将控件放在每一页上。
现在我的页面包含了很多按钮和其他控件。我担心的是,如果它是一个刷新帖子......我不希望任何事件被解雇......
因为我的整个应用程序几乎已经建成,所以在每个事件开始时检查它是否是一个刷新帖是很乏味的。
任何可以帮助我的想法。
为了更清晰起见,包括以下文字:
大家好,我希望有点误会...我不想让用户按下刷新按钮...但我想要的是相应地调整我的应用程序的响应...想象一下,当用户点击按钮时 - 弹出窗口将打开另一个页面。现在,当用户返回并单击主窗口中的刷新按钮时,BUTTON-A的单击事件再次被触发,弹出窗口再次打开...在这种情况下,我想要刷新页面,而不打开弹出窗口。所以,我需要阻止ASP.NET触发BUTTON-A(或任何其他类似按钮)的点击事件
答案 0 :(得分:4)
我知道你不想听到这个,但用户希望能够点击刷新按钮。打破他们喜欢的东西会让他们不高兴。他们会责备你,你的名字会变成泥巴。
想想那些试图阻止后退按钮的网站:你喜欢它们吗?
答案 1 :(得分:3)
这至少是你如何做到这一点的起点。我不确定所有的逻辑都是100%,但它是从...开始的......
protected void Page_Load(object sender, EventArgs e)
{
foreach (Control control in Controls)
{
DisableEvent(control);
}
}
protected void Page_PreRender(object sender, EventArgs e)
{
foreach (Control control in Controls)
{
UpdateViewstate(control);
}
}
private void DisableEvent(Control current)
{
foreach (Control control in current.Controls)
{
if (control.GetType() == typeof(Button))
{
if (IsPostBack)
{
if (Session["update" + control.ID].ToString() != ViewState["update" + control.ID].ToString())
{
RemoveClickEvent((Button)control);
}
else
{
((Button)control).Click += new EventHandler(Button_Disable);
}
}
else
{
Session["update" + control.ID] = Server.UrlEncode(System.DateTime.Now.ToString());
}
}
DisableEvent(control);
}
}
private void UpdateViewstate(Control current)
{
foreach (Control control in current.Controls)
{
if (control.GetType() == typeof(Button))
{
ViewState["update" + control.ID] = Session["update" + control.ID];
}
UpdateViewstate(control);
}
}
void RemoveClickEvent(Button b) {
System.Reflection.FieldInfo f1 = typeof(Button).GetField("EventClick", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
object obj = f1.GetValue(b);
System.Reflection.PropertyInfo pi = typeof(Button).GetProperty("Events", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
System.ComponentModel.EventHandlerList list = (System.ComponentModel.EventHandlerList)pi.GetValue(b, null);
list.RemoveHandler(obj, list[obj]);
}
protected void Button_Disable(object sender, EventArgs e)
{
Button b = (Button)sender;
Session["update" + b.ID] = Server.UrlEncode(System.DateTime.Now.ToString());
}
答案 2 :(得分:1)
您无法阻止用户按“刷新”按钮。它在浏览器中构建功能,重新发送先前的请求,获取或发布。就在那里。
这就是为什么你通常在帖子之后进行重定向到get(例如用户发布到user / 1 / edit并且响应重定向到user / 1 / view),这样刷新就不会导致双重帖子
很抱歉,这不是您想要听到的内容,但在制作Web应用程序时,您应该尝试遵循Web标准并让用户能够使用他/她期望的浏览器功能:返回,前进,刷新。而且我知道你的应用程序已经完成了。
但是如果你开始创建黑客以防止刷新,或其他你不熟悉技术的东西,但是遇到流,你的应用程序将开始携带一个糟糕的包,并且随着应用程序的存在和延长,这个糟糕的方案将成为进一步发展的负担。