2009-09-03 87 views
1

我有一个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(或任何其他类似按钮)的单击事件

回答

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()); 
} 
4

我知道你不想听到这个,但用户希望能够击中刷新按钮。打破他们喜欢的东西会使他们不高兴。他们会责怪你,你的名字会变成泥巴。

想想那些试图阻止Back按钮的网站:你喜欢它们吗?

+0

我明白...但在这个页面,我自己提供了一个刷新按钮,用户可以使用刷新内容...我想阻止按钮点击和其他事件再次被解雇。 – 2009-09-03 08:17:36

+1

@The King--你自己的刷新按钮与内置于浏览器中的刷新按钮有什么关系? – RichardOD 2009-09-03 08:51:02

+1

我自己的刷新按钮只是重新加载页面,并且不会再次触发最后一个控件事件。 – 2009-09-03 09:51:17

1

您不能阻止用户按下刷新按钮。它构建在浏览器的功能中,重新发送之前的请求,获取或发布。它就在那里。

这就是为什么您通常在发布后获得重定向(例如,用户发布到用户/ 1 /编辑和响应重定向到用户/ 1 /视图),以便刷新不会导致双重帖子。

我很抱歉,这不是您想要听到的内容,但是在制作Web应用程序时,您应该尝试遵循Web标准并让用户能够使用他/她期望的浏览器功能:返回,转发和刷新。我知道你的应用程序已经快完成了。

但是,如果您开始创建黑客来防止刷新,或者其他不利用技术流动的东西,但是逆流而上,您的应用程序将开始携带一个错误的软件包,并且随着应用程序的运行并且延长了,这个不好的方案将会成为进一步发展的一个负担。

+1

嗨皮特,我希望有点误解...我不想停止用户按下刷新按钮...但我想要的是相应地调整我的应用程序的响应...想象一下,当用户单击按钮时,一个场景弹出窗口打开另一个页面。现在,当用户回来并单击主窗口中的刷新按钮时,BUTTON-A的单击事件再次被触发并且弹出窗口再次被打开。在这种情况下,我想刷新页面,而不打开弹出窗口。所以,我需要停止ASP.NET触发BUTTON-A(或其他类似按钮)的点击事件 – 2009-09-03 09:56:07

+2

在这种特殊情况下,我会将JavaScript直接作为事件处理程序打开新窗口,即不使其成为服务器控制。听起来你是在放置一个服务器控件,并在事件处理程序中插入一个javascript来重新打开一个新页面?这种特殊情况应该永远不会是回发 – Pete 2009-09-03 10:29:47

+0

通过“我会把JavaScript直接打开新窗口作为按钮的事件处理程序”我的意思是客户端JavaScript事件处理程序 – Pete 2009-09-03 10:30:28

相关问题