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

时间:2011-01-26 14:55:26

标签: c# .net asp.net override multiple-inheritance

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

protected override void Render(HtmlTextWriter writer)
{
     //Code Logic Here
}

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

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

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

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

3 个答案:

答案 0 :(得分: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
    }
}

和...

public partial class MySpecificPage : MyBasePage
{
}

修改

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

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

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

public delegate void OverrideRender(HtmlTextWriter writer, Action<HtmlTextWriter> original);

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

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

答案 1 :(得分:1)

您应该创建一个继承自System.Web.UI.Page的BasePage。在BasePage中,您可以覆盖Render方法,然后让所有页面都从BasePage继承。

答案 2 :(得分:1)

在您的层次结构中添加一个级别并制作BasePage并在那里覆盖,然后继承BasePage

中的所有其他页面