2011-01-26 66 views
5

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

+3

使用基类继承的所有其他网页。页面,然后用它为您的所有网页 – 2011-01-26 14:57:11

+0

编辑:有些使用System.Web.UI.Page类和一些网页从名为ModifiedPage另一类继承和overridies的System.Web.UI.Page类的其他功能继承。所以它不像继承一个类的所有页面那么简单。 – 2011-01-26 15:06:02

回答

12

而不是从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 
      }); 
     } 
    } 
} 
1

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

1

添加一个水平层次结构,并作出BasePage,做你的覆盖在那里,然后从从的System.Web.UI继承BasePage