如何在多个ASP.NET页面上覆盖相同的功能(渲染功能)
采取以下方案。我有多个ASPX页面。登录,注销,主要,消息等等......当然,它们都从System.Web.UI.Page继承。对于所有页面,我想覆盖Page类中的Render方法。我可以很容易地复制和粘贴相同的代码到每个网页就像这样:如何在多个ASP.NET页面上覆盖相同的功能(渲染功能)
protected override void Render(HtmlTextWriter writer)
{
//Code Logic Here
}
但是,如果我有很多的网页,可以说20,保持在每个页面的代码可以得到非常耗时且容易出错。
这让我想起了一点,我想没关系让我们试试这个......重写每个页面中的函数,但调用一个静态函数。这样改变静态功能将导致每个页面的改变。哪些工作正常...但它不是很好,很干净,必须在每一页上重写。任何人对此有任何想法或想法?也许我忽略了一些简单的东西?谢谢
编辑:一些页面使用System.Web.UI.Page类和一些页面继承另一个类,称为ModifiedPage继承和重写System.Web.UI.Page类的其他功能。所以它不像继承一个类的所有页面那么简单。编辑2:所有页面都需要这种行为,有些已经从另一个类派生,我无法更改该其他类的实现或继承层次结构。
而不是从System.Web.UI.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
{
}
编辑
澄清加入问题现在指出了真正的困惑 - 所有这些页面都需要这个共同的Re nder逻辑具有不同的继承路径。这在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
});
}
}
}
您应该创建其继承自System.Web.UI.Page一个BasePage的。在BasePage中,您可以重写Render方法,然后让所有页面从BasePage继承。
添加一个水平层次结构,并作出BasePage
,做你的覆盖在那里,然后从从的System.Web.UI继承BasePage
使用基类继承的所有其他网页。页面,然后用它为您的所有网页 – 2011-01-26 14:57:11
编辑:有些使用System.Web.UI.Page类和一些网页从名为ModifiedPage另一类继承和overridies的System.Web.UI.Page类的其他功能继承。所以它不像继承一个类的所有页面那么简单。 – 2011-01-26 15:06:02