2011-01-26 30 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