Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以使用用户控件或母版页为多个页面创建基本事件处理程序?_C#_Asp.net_Events_User Controls_Master Pages - Fatal编程技术网

C# 是否可以使用用户控件或母版页为多个页面创建基本事件处理程序?

C# 是否可以使用用户控件或母版页为多个页面创建基本事件处理程序?,c#,asp.net,events,user-controls,master-pages,C#,Asp.net,Events,User Controls,Master Pages,我需要为我的页面创建常规操作菜单。所有页面都将实现一些基本功能,即向某些表中添加新行、编辑它们、调用过滤器。许多页面只需要基本逻辑即可运行此功能。但有些页面将为菜单中的选项实现自己的逻辑 我想通过使用菜单中的事件来实现这一点。因此,我不仅需要事件,还需要一些用于所有页面的基本事件处理程序。这个处理程序可以被重写。问题是我不知道如何为菜单的所有未来用途创建处理程序。在某种程度上听起来有点乌托邦。这样的建筑是真的吗 我考虑了两种方法:母版页或用户控制。但我真的不知道这是否可能。那你觉得呢 UPD:对

我需要为我的页面创建常规操作菜单。所有页面都将实现一些基本功能,即向某些表中添加新行、编辑它们、调用过滤器。许多页面只需要基本逻辑即可运行此功能。但有些页面将为菜单中的选项实现自己的逻辑

我想通过使用菜单中的事件来实现这一点。因此,我不仅需要事件,还需要一些用于所有页面的基本事件处理程序。这个处理程序可以被重写。问题是我不知道如何为菜单的所有未来用途创建处理程序。在某种程度上听起来有点乌托邦。这样的建筑是真的吗

我考虑了两种方法:母版页或用户控制。但我真的不知道这是否可能。那你觉得呢

UPD:对基本页面的两个答案都投了赞成票:你们肯定知道自己在说什么。谢谢很抱歉,正确答案只能选择一次。

我认为“为所有未来用途创建处理程序”听起来很可怕

我要做的是单独创建页面,只有当我确定了一些相同或相似的逻辑时,我才会将其重构为一个单独的类,几个表单可以使用这个类


毕竟,代码在重用之前需要先被使用。

你真的不应该像这种方法那样不必要地实例化页面上的对象

记住这一点,您可以创建一个相关页面从中继承的基页,这样您就可以访问所需的方法

  • 创建System.Web.UI.Page类型的类。(我们将其命名为MyBasePageClass)
  • 实现此类中所需的通用方法
  • 在需要向其公开方法的页面上继承此类。例如,将Default.aspx页面类的定义更改为: 公共部分类默认值:MyBasePageClass

  • 默认情况下,在MyBasePageClass中创建的方法必须是公共的。aspx.cs。

    在我的许多应用程序中,如果我有跨多个页面共享的功能,我会使用公共基类。这真的不是什么稀奇的做法

    实现可能如下所示:

    public class MyApplicationPage : System.Web.UI.Page
    {
        public virtual void RaiseMyCustomEvent(EventArgs e)
        {
        }
    }
    
    public partial class MyPage : MyApplicationPage
    {
        public override void RaiseMyCustomEvent(EventArgs e)
        {
            // ...
        }
    }
    
    virtual
    关键字使方法可重写

    在我的个人代码中,页面继承可能如下所示:

    public class MyApplicationPage : System.Web.UI.Page
    {
        public virtual void RaiseMyCustomEvent(EventArgs e)
        {
        }
    }
    
    public partial class MyPage : MyApplicationPage
    {
        public override void RaiseMyCustomEvent(EventArgs e)
        {
            // ...
        }
    }
    
    最后,在我的母版页中,我可能会在一个方法中找到如下代码:

    if (Page is MyApplicationPage)
    {
        ((MyApplicationPage)Page).RaiseMyCustomEvent(EventArgs.Empty);
    }
    

    因为这是许多程序员提出的一个问题,所以我投了赞成票。当然,这是对的,但我只是将用Delphi编写的Winforms项目重新构建为Asp.Net。在旧版本中有这种体系结构,但我当然不能仅仅复制用Deplhi的特殊功能和黑客编写的Delphi算法,尤其是在web上。我相信如果您尝试重新创建相同的应用程序流和逻辑,您将很难将项目从WinForms移动到WebForms。这两种技术的语义太不一样了。是的-创建基类是一种方法,如上所述,但有两个更正:第一个事件处理程序方法不需要是公共的,它们可以得到保护。其次,您希望使它们成为虚拟的,以便某些页面可以覆盖默认事件处理行为并提供自己的行为。是的,抱歉,受保护,因为您是从类继承的。