引发由.Net Web应用程序的完全独立部分处理的控制事件

引发由.Net Web应用程序的完全独立部分处理的控制事件,.net,asp.net,events,design-patterns,.net,Asp.net,Events,Design Patterns,各位 我觉得有一个经典的设计模式涵盖了这个案例,但我手头没有参考资料 我遇到过这样一种情况:用户单击一个按钮,网页的另一部分就会响应。不寻常(或至少不方便)的是,按钮和网页的转发部分处于非常不同的控制层次结构中,无论是从与共同祖先的距离还是从应用程序的角度来看。它们都是一系列(单独的)黑匣子的内部部分 我还没能想出一个优雅的方法让一个触发另一个。我不想将一系列事件提升到控件层次结构的顶部,然后调用一系列嵌套方法来实现所需的效果。(“effect”!=visual effect;我无法用jQuer

各位

我觉得有一个经典的设计模式涵盖了这个案例,但我手头没有参考资料

我遇到过这样一种情况:用户单击一个按钮,网页的另一部分就会响应。不寻常(或至少不方便)的是,按钮和网页的转发部分处于非常不同的控制层次结构中,无论是从与共同祖先的距离还是从应用程序的角度来看。它们都是一系列(单独的)黑匣子的内部部分

我还没能想出一个优雅的方法让一个触发另一个。我不想将一系列事件提升到控件层次结构的顶部,然后调用一系列嵌套方法来实现所需的效果。(“effect”!=visual effect;我无法用jQuery解决这个问题)我希望事件和响应者彼此保持无知:我不会让后者知道并直接订阅前者生成的事件,从而违反关注点分离。我考虑过其他一些不雅观的解决方案,但我不会把它们一一列举出来

基本上,我想我需要一种方法来实现事件的发布者-订阅者模型,其中任何东西都可以订阅任何东西

我正在使用.NET4.0。有什么好的框架可以做到这一点吗?有什么简单的实现方法吗

非常感谢


Ann L.

听起来你需要一个事件聚合器。您应该在复合应用程序库中找到实现


EventAggregator允许您注册到通知,并从应用程序完全分离的部分引发通知

我不确定我是否正确理解您的意思,但听起来您希望将多个按钮分配给同一个事件处理程序,您可以这样做:

<asp:Button ID="Button1" runat="server" Text="Button 1" OnClick="Button_Click" ... />
<asp:Button ID="Button2" runat="server" Text="Button 2" OnClick="Button_Click" ... />
public event EventHandler ButtonClick;

protected void Button_Click(object sender, EventArgs e)
{
    if (this.ButtonClick != null)
        this.ButtonClick(sender, e);
}    
编辑

根据您的评论,听起来您可能需要一个事件处理程序。如果是这样,请尝试以下方法:

<asp:Button ID="Button1" runat="server" Text="Button 1" OnClick="Button_Click" ... />
<asp:Button ID="Button2" runat="server" Text="Button 2" OnClick="Button_Click" ... />
public event EventHandler ButtonClick;

protected void Button_Click(object sender, EventArgs e)
{
    if (this.ButtonClick != null)
        this.ButtonClick(sender, e);
}    

对于服务器端事件,您可以使用:
无功扩展(Rx).

对于客户端事件,您可以使用:
主干JS

击倒JS


您提到您不能使用jQuery,我可以问一下原因吗?

您是在寻找客户端事件还是服务器端事件?并不是我不能使用jQuery;不过,谢谢你的链接:它们看起来非常有用。我不知道Rx存在。谢谢,但是处理程序不是控件的父类。它在哪里?你是不是想把这件事搞得沸沸扬扬?你可能会说这件事是在控制的“表亲”里。页面有两个部分,A和B。它们彼此不“了解”,也不相互交谈——除了一件事,A中的许多自定义控件层的按钮需要使B中的一些代码深层反应。我想尽量减少A需要知道B是如何实现的,反之亦然。您可以从页面访问
A
B
吗?如果是这样,请为每个部分创建一个自定义事件处理程序,并将它们订阅到页面上的相同事件处理程序。我回答的第二和第三部分应该给你你需要的。如果没有,请修改您的问题并加入一些示例标记,以便我们更好地了解问题所在。是的!这就是我想要的!非常感谢你!