Вместо того, чтобы наследовать от 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
});
}
}
}