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)