如何阻止事件触发+ ASP.NET

时间:2009-09-03 08:05:36

标签: c# asp.net refresh

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

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

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

因为我的整个应用程序几乎已经建成,所以在每个事件开始时检查它是否是一个刷新帖是很乏味的。

任何可以帮助我的想法。

  • 拉加

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

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

3 个答案:

答案 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标准并让用户能够使用他/她期望的浏览器功能:返回,前进,刷新。而且我知道你的应用程序已经完成了。

但是如果你开始创建黑客以防止刷新,或其他你不熟悉技术的东西,但是遇到流,你的应用程序将开始携带一个糟糕的包,并且随着应用程序的存在和延长,这个糟糕的方案将成为进一步发展的负担。