如何在多个ASP.NET页面上覆盖相同的函数(渲染函数)

Iss*_*ram 5 .net c# asp.net overriding multiple-inheritance

采取以下方案.我有多个ASPX页面.登录,注销,主要,消息等...当然,它们都从System.Web.UI.Page继承.对于所有页面,我想从Page类重写Render方法.我可以轻松地将相同的代码复制并粘贴到每个页面中,如下所示:

protected override void Render(HtmlTextWriter writer)
{
     //Code Logic Here
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我有很多页面,可以说20,维护每个页面中的代码可能会非常耗时且容易出错.

这让我有点思考,我认为可以尝试这个...覆盖每个页面中的函数,但调用静态函数.这样改变静态函数会导致每个页面发生变化.哪个工作正常...但它不是很好,干净,不得不像每页上的那样覆盖.有人对此有任何想法或想法吗?或许我可以忽视一些简单的事情 谢谢

编辑:一些页面使用System.Web.UI.Page类,一些页面继承自另一个名为ModifiedPage的类,该类继承并覆盖System.Web.UI.Page类的其他函数.所以它不像从一个类继承所有页面那么简单.

EDIT2:所有页面都需要这种行为,有些页面已经从另一个类派生,我无法更改其他类的实现或继承层次结构.

Rex*_*x M 12

不是继承System.Web.UI.Page,而是从MyProject.MyBasePage继承自Page的继承:

public abstract class MyBasePage : System.Web.UI.Page
{
    protected override void Render(HtmlTextWriter writer)
    {
        //Code Logic Here
    }
}
Run Code Online (Sandbox Code Playgroud)

和...

public partial class MySpecificPage : MyBasePage
{
}
Run Code Online (Sandbox Code Playgroud)

编辑

现在添加到问题中的澄清指出了真正的难题 - 所有需要这种常见渲染逻辑的页面都有不同的继承路径.这在c#中比较棘手,你将无法避免至少一些冗余的管道代码.有很多不同的方法可以解决这个问题 - 这是我过去采取的一种方法:

1)为此常用功能创建一个界面.例如,IOverrideRender:

public interface IOverrideRender
{
    void Register(OverrideRender render);
}

public delegate void OverrideRender(HtmlTextWriter writer, Action<HtmlTextWriter> original);
Run Code Online (Sandbox Code Playgroud)

2)每个需要此功能的页面都会获得接口并将其连线:

public partial class MyPage : Page, IOverrideRender
{
    void IOverrideRender.Register(OverrideRender render)
    {
        this.overrideRender = render;
    }

    private OverrideRender overrideRender;

    protected override void Render(HtmlTextWriter writer)
    {
        if(overrideRender != nul)
        {
            overrideRender(writer, base.Render);
        }
        else
        {
            base.Render(writer);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3)在HttpModule中,检查处理程序是否是IOverrideRender,如果是,则传入自定义渲染方法:

public class OverrideRenderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += this.HandlePreRequestExecute;
    }

    private void HandlePreRequestExecute(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;
        IOverrideRender overridable = app.Context.CurrentHandler as IOverrideRender;
        if(overridable != null)
        {
            overridable.Register(
                (writer, original) => {
                    writer.Write("Hello world"); //custom write
                    original(writer); //calls base.Render
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)