0

我想知道我是否可以根据以下条件防止页面加载时的事件冒泡/传播:

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

这可能吗?

4

5 回答 5

3

防止事件冒泡有两个困难 - 检测 F5 并停止事件 - 我只需使用Post/Redirect/Get-pattern:

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);
}
于 2013-04-15T15:13:35.707 回答
1

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

另一种选择可能是做类似的事情:

this.Load -= MyPageLoadMethod;

您可能正在查看事件本身,而不是 OnLoad 方法。不管怎样,我认为这是可能的,在这里查看一些选项如何从控件中删除所有事件处理程序

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


像这里的大多数人一样,我认为你没有解决正确的问题。很抱歉,我认为这同样适用于 Emad 的解决方案。

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

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

您可能尝试的所有其他方法都将不再是一种肮脏的解决方法,而是一种适当的解决方案。

--

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

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

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

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

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

  • 如果会话被禁用,您可以使用 cookie。您可以在发送之前检查 cookie 的日期,这样如果重定向从未发生(使用网络丢失或其他),并且在他没有看到过时消息时使用稍后到达页面。

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

您还可以在 Google 上搜索 Rails Flash-like 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-Redirect,开玩笑),也很安全。

就像是:

Response.Redirect(Request.RawUrl);

更新 2

就像上面提到的,如果你在页面初始化之后运行,比如在页面加载中,你总是可以以类似于以下的方式删除事件:

this.SubmitButton.Click -= SubmitButton_Click;

你明白了……

如果您想要停止特定事件,这很有用,而前面的答案假设您正在尝试停止大多数事件。

http://gurustop.net

于 2013-04-20T05:48:56.580 回答
1

我在 ASP.NET WebForms 项目中做过一次,当用户按下 F5 时,它会执行刷新以外的操作,我通过使用 jQuery keypress 甚至对页面调用 e.preventDefault(); 来完成此操作。检查这个

更新:

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

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

于 2013-04-17T09:25:51.917 回答
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)

于 2013-04-17T12:12:55.163 回答
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];
于 2014-04-22T16:38:21.147 回答