采取以下方案。我有多个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:所有页面都需要这种行为,有些页面已经派生自另一个类,我无法更改其他类的实现或继承层次结构。
答案 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