如何在asp.net中阻止/停止页面加载时的事件冒泡/传播

时间:2013-04-15 15:02:54

标签: asp.net events page-lifecycle event-bubbling stoppropagation

我想知道是否可以根据以下条件阻止事件冒泡/传播:

protected override void OnLoad(EventArgs e)
{
    // If the user press F5 from the browser
    if (IsRefresh)
    {
        // Here I want to stop propagation/bubbling the events like OnClick of a submit button but without using the button object (I want it generic)
    }
    else
    {
        base.OnLoad(e);
    }
}

这可能吗?

5 个答案:

答案 0 :(得分:3)

防止事件冒泡有两个难点 - 检测F5并停止事件 - 我只想使用Post/Redirect/Get - 模式:

protected void Button1_Click(object sender, System.EventArgs e)
{
    // do what you need to do
    // now redirect to the same page, 
    // then a browser-refresh via F5 won't trigger this event again
    Response.Redirect(Request.Url.PathAndQuery);
}

答案 1 :(得分:1)

我曾经在ASP.NET WebForms项目中做过一次当用户按下F5时它会执行除刷新以外的操作,我通过使用jQuery keypress完成此操作,即使对于页面也调用e.preventDefault();检查this

更新

$(document).ready(){function(){
        this.keydown(e){
          if (e.which == 116){
                  e.preventDefault();
             window.location.href = "http://foo.com/?IsReferesh=1";     
           }
        };    
)};

您可以使用QueryString检查用户是否按下F5和Code Behind中的反射。如果我错过了什么,那么我并不完全理解你的问题。

答案 2 :(得分:1)

关于你问题的细节,如何反转它?也许只有在不满足条件时才添加Load事件监听器(例如,在页面Init中)。

另一种选择可能是:

this.Load -= MyPageLoadMethod;

您可能正在查看事件本身,而不是OnLoad方法。无论如何,我认为这是可能的,请参阅How to remove all event handlers from a control

中的一些选项

虽然有一个很大的“但是......”


像大多数人一样,我认为你没有解决正确的问题。对不起,我认为同样适用于Emad的解决方案。

蒂姆钉了它。这个答案将尝试更多地解释这个选项。

Post-Get-redirect模式非常受欢迎且非常标准。在我们的大多数应用程序中,通过在页面加载之前重新单击提交按钮或刷新浏览器导致另一个POST调用不止一次提交相同的表单是错误的,因此,在非AJAX表单提交后重定向的做法已成为如此标准。

你可能尝试的其他任何事情都不会是一个肮脏的解决方法而不是一个正确的解决方案。

-

现在,出现了向用户提供反馈的问题。 Ruby On Rails为这个名为Flash帮助器提供了一个漂亮的帮助器。这是一个你可以在重定向之前设置的消息(如果没有重定向,甚至在同一页面中),下次你显示它时,它会自行销毁,下次你调用它时,你什么也得不到。所以,你什么都不显示。

ASP.NET MVC有类似这样的TempData。默认情况下,TempData可以存储在很多地方,因此,如果要从MVC操作重定向,可以设置类似TempData['Message']的内容,并在下一个Controller中读取它。 ASP.NET MVC将在重定向后处理它。

那么,Webforms怎么样?没有什么可以阻止你这样做。这真的不是火箭科学

  • 您可以检查URL Referrer是否是编辑页面,并根据该页面显示消息。

  • 您可以在重定向之前在会话中存储消息,并在每个页面加载中检查它,如果找到,则显示它并从会话中删除

  • 如果禁用会话,则可以使用Cookie。你可以在发送之前检查cookie的日期,这样如果重定向从未发生过(使用网络丢弃或其他),并且在他没有看到过时消息的时候使用了来到页面。

  • 您还可以存储在缓存中(当然,缓存是应用程序范围内的某些与用户相关的密钥),然后您可以将缓存过期设置为一段短时间,以避免在cookie选项中解释的问题

你也可以谷歌搜索Rails Flash-for ASP.NET Webforms,看看其他人想出的可重用组件。例如,这个结果出现在我的搜索中:
http://highoncoding.com/Articles/542_Creating_Rails_Like_Flash_Feature_in__NET_The_Flash_Control.aspx
检查NuGet也许那里有东西。无论如何,建立自己的并不难。


<强>更新

另一种简单的方法可能只是重定向到同一个URL,这将导致GET请求并且不会运行任何处理程序,非常接近Post-Get-Redirect的原始实现(你的将是post-Post-重定向也许,开玩笑),也非常安全。

类似的东西:

Response.Redirect(Request.RawUrl);

更新2

正如上面所提到的,如果您在页面初始化之后运行,例如在页面加载中,您可以始终以类似于以下的方式移动事件:

this.SubmitButton.Click -= SubmitButton_Click;

你明白了......

如果您想要的是停止特定事件,那么这很有用,而答案的前几位假设您正在尝试停止大部分事件。

  

http://gurustop.net

答案 3 :(得分:0)

protected override void OnLoad(EventArgs e)
{
        if (!IsPostBack)
        {
            if (Request.UrlReferrer != null)
                if (Request.UrlReferrer.PathAndQuery == Request.RawUrl)
                {
                    // Show Message
                }
        }
}

protected void Button1_Click(object sender, System.EventArgs e)
{   
     Response.Redirect(Request.Url.PathAndQuery);
}

注意:

if (Request.UrlReferrer.PathAndQuery == Request.RawUrl) //无法使用Chrome 所以你可以用它替换它 if (Request.UrlReferrer.AbsolutePath == Request.Url.AbsolutePath)

答案 4 :(得分:0)

    static string REFRESH_CHECK_GUID = "REFRESH_CHECK_GUID";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState[REFRESH_CHECK_GUID] != null && !ViewState[REFRESH_CHECK_GUID].ToString().Equals(Session[REFRESH_CHECK_GUID].ToString()))
        {
            Response.Redirect("Login.Aspx");
        }

        Session[REFRESH_CHECK_GUID] = System.Guid.NewGuid().ToString();
        ViewState[REFRESH_CHECK_GUID] = Session[REFRESH_CHECK_GUID];