【问题标题】:How To Override The Same Function On Multiple ASP.NET Pages (Render Function)如何在多个 ASP.NET 页面上覆盖相同的函数(渲染函数)
【发布时间】:2011-06-15 21:52:48
【问题描述】:

以下面的场景为例。我有多个 ASPX 页面。 Login、Logout、Main、Messages 等……当然,它们都继承自 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:所有页面都需要这种行为,有些页面已经派生自另一个类,我无法更改该其他类的实现或继承层次结构。

【问题讨论】:

  • 使用继承自 System.Web.UI.Page 的基类,然后将其用于所有页面
  • 编辑:有些页面使用 System.Web.UI.Page 类,有些页面继承自另一个名为 ModifiedPage 的类,该类继承并覆盖 System.Web.UI.Page 类的其他功能。所以它不像从一个类中继承所有页面那么简单。

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


【解决方案1】:

不要从System.Web.UI.Page继承,而是让它们都从继承自Page的MyProject.MyBasePage继承:

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

【讨论】:

  • thx Rex...它丑陋的大声笑,但我知道需要一些界面。希望它有效
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在您的层次结构中添加一个级别并创建一个BasePage 并在那里进行覆盖,然后从BasePage 继承所有其他页面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多