【问题标题】:How to stop a event from firing + ASP.NET如何阻止事件触发 + ASP.NET
【发布时间】:2010-11-25 05:10:07
【问题描述】:

我有一个网页,我必须在该网页上检测并阻止使用浏览器刷新按钮。 (现在请不要建议我使用 Response.Redirect,我将无法在这种情况下使用它)。

在查看此页面http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh.4 时,我找到了方法。我打算把这个想法放在一个控件中,并将控件放在每个页面上。

现在我的页面包含如此多的按钮和其他控件。我担心的是,如果是刷新帖子...我不希望任何事件被解雇...

由于我的整个应用程序几乎构建完成,因此在每个事件开始时检查它是否是刷新帖子会很乏味。

任何对我有帮助的想法。

  • 拉贾

为了更清楚起见,包括以下文字:

大家好,我希望有点误解...我不想阻止用户按下刷新按钮...但我只想相应地调整我的应用程序的响应...想象一个场景,当用户单击 BUTTON-一个弹出窗口打开另一个页面。现在,当用户返回并单击主窗口中的刷新按钮时,再次触发 BUTTON-A 的单击事件并再次打开弹出窗口......在这种情况下,我想刷新页面,而不打开弹出窗口。所以,我需要阻止 ASP.NET 触发 BUTTON-A(或任何其他类似按钮)的点击事件

【问题讨论】:

    标签: c# asp.net refresh


    【解决方案1】:

    我知道您不会想听到这个,但用户希望能够点击刷新按钮。破坏他们喜欢的东西会让他们不开心。他们会责备你,你的名字将是泥巴。

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

    【讨论】:

    • 我明白...但是在这个页面中,我自己提供了一个刷新按钮,用户可以使用它来刷新内容...我想阻止按钮单击和其他事件获取再次被解雇。
    • @The King- 与浏览器内置的刷新按钮相比,您自己的刷新按钮有什么好处?
    • 我自己的刷新按钮只是重新加载页面..并且不会再次触发最后一个控件事件。
    • 好吧,我可以看出你正在尝试,但就个人而言,如果某个页面给我带来了麻烦,我会想都没想就按 F5。我不会在页面上四处寻找按钮。即使它在中间,就在途中,我仍然会按 F5,因为按一个键总是比使用触控板将鼠标置于按钮中心然后单击要容易。真的,你不应该试图破坏浏览器——人们不会高兴的。
    【解决方案2】:

    这至少是您如何做到这一点的起点。我不确定所有的逻辑都是 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());
    }
    

    【讨论】:

      【解决方案3】:

      您不能阻止用户按下刷新按钮。它在浏览器中内置了重新发送先前请求、获取或发布的功能。它就在那里。

      这就是为什么您通常在发布到 get 之后进行重定向(例如,用户发布到 user/1/edit 并且响应重定向到 user/1/view),这样刷新不会导致重复发布.

      很抱歉,这不是您想听到的,但是在制作 Web 应用程序时,您应该尽量遵循 Web 标准,让用户能够使用他/她期望的那些浏览器功能:返回,前进,刷新。而且我知道你的申请快完成​​了。

      但是,如果您开始创建 hack 以防止刷新,或者其他您没有使用技术但逆流而上的东西,您的应用程序将开始携带一个坏包,并且随着应用程序的继续存在并且扩展,这个坏包将成为进一步开发的负担。

      【讨论】:

      • 嗨皮特,我希望有点误解...我不想停止用户按下刷新按钮...但我只想相应地调整我的应用程序的响应...想象一个场景,当用户单击 BUTTON-A 时,会打开一个带有另一个页面的弹出窗口。现在,当用户返回并单击主窗口中的刷新按钮时,再次触发 BUTTON-A 的单击事件并再次打开弹出窗口......在这种情况下,我想刷新页面,而不打开弹出窗口。所以,我需要阻止 ASP.NET 触发 BUTTON-A(或任何其他类似按钮)的点击事件
      • 在这种特殊情况下,我会将打开新窗口的 javascript 直接作为按钮的事件处理程序放置,即不使其成为服务器控件。在我看来,您正在放置一个带有事件处理程序的服务器控件,该事件处理程序注入一个 javascript 以在重新加载时打开一个新页面?这种特殊情况永远不应该是回发
      • 通过“我将放置 javascript 以直接打开新窗口作为按钮的事件处理程序”我的意思是客户端 javascript 事件处理程序
      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多