2011-01-26 15 views
5

Prendere lo scenario seguente. Ho più pagine ASPX. Accesso, Disconnessione, Principale, Messaggi, ecc. Tutti ereditano da System.Web.UI.Page, ovviamente. Per tutte le pagine, voglio sovrascrivere il metodo Render dalla classe Page. Potrei facilmente copiare e incollare lo stesso codice in ciascuna pagina in questo modo:Come eseguire l'override della stessa funzione su più pagine ASP.NET (funzione Render)

protected override void Render(HtmlTextWriter writer) 
{ 
    //Code Logic Here 
} 

Ma se dovessi molte pagine, consente di dire 20, mantenendo il codice in ogni pagina potrebbe arrivare molto in termini di tempo e soggetto a errori.

Questo mi ha fatto riflettere un po 'e ho pensato di provare questo ... ignorare la funzione in ogni pagina ma chiamare una funzione statica. In questo modo, la modifica della funzione statica determinerebbe una modifica per ogni pagina. Che funziona bene ... Ma non è proprio bello e pulito, dovendo scavalcare così su ogni singola pagina. Qualcuno ha qualche idea o idea su questo? Forse qualcosa di semplice sto trascurando? Grazie

MODIFICA: alcune pagine utilizzano la classe System.Web.UI.Page e alcune pagine ereditano da un'altra classe chiamata ModifiedPage che eredita e sovrascrive altre funzioni della classe System.Web.UI.Page. Quindi non è così semplice come ereditare tutte le pagine di una classe.

EDIT2: tutte le pagine richiedono questo comportamento, alcune derivano già da un'altra classe e non sono in grado di modificare l'implementazione o la gerarchia di ereditarietà di quell'altra classe.

+3

classe base all'uso che eredita da System.Web.UI.Pagina e quindi utilizzare quello per tutte le pagine –

+0

MODIFICA: alcune pagine utilizzano la classe System.Web.UI.Page e alcune pagine ereditano da un'altra classe denominata ModifiedPage che eredita e sovrascrive altre funzioni della classe System.Web.UI.Page. Quindi non è così semplice come ereditare tutte le pagine di una classe. –

+1

vedere la mia risposta rivista. –

risposta

12

Invece di ereditare da System.Web.UI.Page, li hanno tutti ereditano da MyProject.MyBasePage che eredita da Pagina:

public abstract class MyBasePage : System.Web.UI.Page 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     //Code Logic Here 
    } 
} 

e ...

public partial class MySpecificPage : MyBasePage 
{ 
} 

Modifica

Chiarimento aggiunto alla la domanda ora indica il vero rompicapo: le pagine che hanno tutti bisogno di questo Re comune la logica di nder ha percorsi di ereditarietà diversi. Ciò è più complicato in C# e non sarà possibile evitare almeno un po 'di codice idraulico ridondante. Esistono molti modi per gestirlo: ecco un approccio che ho preso in passato:

1) Creare un'interfaccia per questa funzionalità comune. Ad esempio, IOverrideRender:

public interface IOverrideRender 
{ 
    void Register(OverrideRender render); 
} 

public delegate void OverrideRender(HtmlTextWriter writer, Action<HtmlTextWriter> original); 

2) Ogni pagina che necessita questa funzionalità ottiene l'interfaccia e fili in questo modo:

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) In un HttpModule, verificare se il gestore è IOverrideRender e in tal caso, passare la vostra abitudine di rendering metodo:

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 
      }); 
     } 
    } 
} 
+0

thx Rex ... il suo brutto lol, ma sapevo che sarebbe stata necessaria un'interfaccia. spero funzioni –

1

È necessario creare un BasePage che eredita da System.Web.UI.Page. All'interno di BasePage è possibile sovrascrivere il metodo Render e quindi ereditare tutte le pagine da BasePage.

1

Aggiungi un livello nella gerarchia e fare una BasePage e fare la vostra esclusione lì, poi ereditare tutti gli altri pagina dal BasePage

Problemi correlati