是否可以使父页面中的按钮单击事件优先于子页面上的事件

时间:2015-10-26 15:14:15

标签: c# asp.net buttonclick

我有超过600页都有取消按钮,他们都拨打一行Response.Redirect("~/Default.aspx");导航到主屏幕。这些页面都是从基页继承而来的,我不确定为什么按钮点击不是刚刚在基页中定义的,因为在我开始处理它之前这一切都已经到位。

我试图将按钮点击事件移动到基​​页,因为它现在需要转到四个主屏幕之一,而不是总是转到网站的根目录,这取决于网站的区域用户当前正在使用,因此我需要在重定向发生之前执行一些功能。

我知道我可以从页面中删除按钮点击事件并将其添加到基页中,但这意味着要浏览600多页,所以我想知道是否可以将按钮点击事件添加到基页并使其覆盖实际页面上的任何事件,因此我不必将它们全部删除。只是将事件添加到基页并不起作用,因为它总是似乎触发了页面事件,甚至没有查看基页。

我尝试在FindControlOnInit基页事件中添加递归OnLoad循环来查找按钮并覆盖Button.PostBackUrl,但它出现了循环控制会导致其他方面的问题。那是另一天的问题!

我知道这不是最佳解决方案,因为它会在所有页面上留下冗余代码,但我只需要快速解决方案。

任何帮助将不胜感激。 感谢

1 个答案:

答案 0 :(得分:0)

您要做的是拦截发送到按钮的WM_MOUSE消息。在Windows中,这被称为一个钩子,带有一个钩子,你可以说在你得到它之前你想要windows消息。您可以调查该消息并决定将消息发送到原始目标,或者隐藏消息。在这种情况下,原始目的地不会获得Windows消息,并且没有注意到该按钮被按下了。

使用win32.dll中的SetWindowsHookEx完成对消息链的挂钩。这是非常低级别的,因此代码不安全。 StackOverflow上有几个关于SetWindowsHookEx,CallNextHookEx,UnhookWindowsHookEx的问题,但我找不到一个可用于搁架的示例。

微软有一个关于如何做到这一点的简单示例 How to set a Windows hook in Visual C# .NET

此示例显示如何在另一个窗口中获取鼠标移动。它使用一个过时的功能。幸运的是它仍然有效。

要删除已弃用的功能,请更改以下内容

hHook = SetWindowsHookEx(WH_MOUSE,
            MouseHookProcedure,
            (IntPtr)0,
            AppDomain.GetCurrentThreadId()); <== obsolete

将其替换为:

ProcessThread runningThread = Process.GetCurrentProcess().Threads
    .OfType<ProcessThread>()
    .SingleOrDefault(thread => thread.ThreadState == ThreadState.Running );
    if (runningThread != null)
    {
        hHook = SetWindowsHookEx(WH_MOUSE,
            MouseHookProcedure,
            (IntPtr)0,
            runningThread.Id);    // <== works ok
    }

挂钩和脱钩是一个非常繁琐的过程。幸运的是,一个nuget包给你带来了困难:

Nuget Package MouseHook

使用此程序包可以在控件获取事件之前在应用程序中发生任何鼠标事件时获取事件。对于每个事件,您可以决定是希望控件获取消息还是想要执行其他操作,并吞下消息。请参阅MouseHook中的示例