如何停止触发事件+ ASP.NET
我有一个WebPage,我必须检测并阻止使用浏览器刷新按钮。 (现在请,不建议我Response.Redirect,我不能在这种情况下使用它)。如何停止触发事件+ ASP.NET
看这个网页http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh.4我找到了方法。我打算将这个想法放在Control中,并将控件放在每一页上。
现在我的页面包含如此多的按钮和其他控件。我的担忧是,如果是刷新帖子...我不想让任何事件被炒鱿鱼......
这将是繁琐的去检查它是否是每个事件开始时的刷新帖子,因为我的整个应用程序几乎建成。
任何想法,可以帮助我。
- 拉贾
包括下面的文字更加清晰的缘故
大家好,我希望有点误会......我不想阻止用户按下刷新按钮.. 。但我只想调整我的应用程序的响应......想象一下,当用户单击BUTTON-A时,会弹出一个窗口并打开另一个页面。现在,当用户回来并单击主窗口中的刷新按钮时,BUTTON-A的单击事件再次被触发并且弹出窗口再次被打开。在这种情况下,我想刷新页面,而不打开弹出窗口。所以,我需要停止ASP.NET发起BUTTON-A(或任何其他类似按钮)的单击事件
这至少是你如何做到这一点的起点。我不确定所有的逻辑是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());
}
我知道你不想听到这个,但用户希望能够击中刷新按钮。打破他们喜欢的东西会使他们不高兴。他们会责怪你,你的名字会变成泥巴。
想想那些试图阻止Back按钮的网站:你喜欢它们吗?
您不能阻止用户按下刷新按钮。它构建在浏览器的功能中,重新发送之前的请求,获取或发布。它就在那里。
这就是为什么您通常在发布后获得重定向(例如,用户发布到用户/ 1 /编辑和响应重定向到用户/ 1 /视图),以便刷新不会导致双重帖子。
我很抱歉,这不是您想要听到的内容,但是在制作Web应用程序时,您应该尝试遵循Web标准并让用户能够使用他/她期望的浏览器功能:返回,转发和刷新。我知道你的应用程序已经快完成了。
但是,如果您开始创建黑客来防止刷新,或者其他不利用技术流动的东西,但是逆流而上,您的应用程序将开始携带一个错误的软件包,并且随着应用程序的运行并且延长了,这个不好的方案将会成为进一步发展的一个负担。
嗨皮特,我希望有点误解...我不想停止用户按下刷新按钮...但我想要的是相应地调整我的应用程序的响应...想象一下,当用户单击按钮时,一个场景弹出窗口打开另一个页面。现在,当用户回来并单击主窗口中的刷新按钮时,BUTTON-A的单击事件再次被触发并且弹出窗口再次被打开。在这种情况下,我想刷新页面,而不打开弹出窗口。所以,我需要停止ASP.NET触发BUTTON-A(或其他类似按钮)的点击事件 – 2009-09-03 09:56:07
在这种特殊情况下,我会将JavaScript直接作为事件处理程序打开新窗口,即不使其成为服务器控制。听起来你是在放置一个服务器控件,并在事件处理程序中插入一个javascript来重新打开一个新页面?这种特殊情况应该永远不会是回发 – Pete 2009-09-03 10:29:47
通过“我会把JavaScript直接打开新窗口作为按钮的事件处理程序”我的意思是客户端JavaScript事件处理程序 – Pete 2009-09-03 10:30:28
我明白...但在这个页面,我自己提供了一个刷新按钮,用户可以使用刷新内容...我想阻止按钮点击和其他事件再次被解雇。 – 2009-09-03 08:17:36
@The King--你自己的刷新按钮与内置于浏览器中的刷新按钮有什么关系? – RichardOD 2009-09-03 08:51:02
我自己的刷新按钮只是重新加载页面,并且不会再次触发最后一个控件事件。 – 2009-09-03 09:51:17