2009-09-21 8 views
3

uitest.ascx Les événements usercontrol ne se déclenchent pas, est-ce que quelqu'un a une idée à ce sujet?Les événements Usercontrol ne se déclenchent pas dans Httphandler

 business.Pages.Page page1 = new business.Pages.Page();    

     System.Web.UI.HtmlControls.HtmlForm form = 
       new System.Web.UI.HtmlControls.HtmlForm(); 
     UserControl uc = 
       (UserControl)page1.LoadControl("~/usercontrols/uitest.ascx");    

     form.Controls.Add(uc); 

     page1.Controls.Add(form); 

     StringBuilder sb = new StringBuilder(); 
     StringWriter tw = new StringWriter(sb); 
     HtmlTextWriter hw = new HtmlTextWriter(tw); 

     page1.RenderControl(hw);    

     context.Response.Write(newContent); 

Répondre

2

Voyons ce qui s'est passé ici. Vous avez créé une instance business.Pages.Page, ce qui signifie que le constructeur de la classe de page est appelé. Ensuite, vous avez ajouté un contrôle à la collection Controls. Ensuite, vous avez appelé la méthode RenderControl() sur cette page.

Vous n'avez jamais lancé de cycle de vie de requête pour cette page. Comment les pages OnInit, OnLoad de la page peuvent-elles toujours se déclencher si vous n'appelez pas une méthode qui les déclenche? Pendant un chargement de page normal, la page est le HttpHandler et le pipeline de requêtes déclenche chaque événement, qui à son tour cascade dans l'arborescence de contrôle de la page, en tirant sur chaque contrôle enfant.

En interne, cela se fait en appelant System.Web.UI.Page.ProcessRequest(), que vous pourriez probablement appeler via la réflexion mais qui peut avoir des résultats imprévisibles.

La clé à retenir ici est que ces classes de contrôle de page et utilisateur ne sont pas spéciales - elles fonctionnent comme toutes les autres classes. Si vous new() les, le constructeur se déclenche. Si vous appelez RenderControl(), cette méthode se déclenche. Rien de plus que ça!

1

Si ce code est en cours d'exécution dans une mesure HttpHandler (comme je suppose que le titre de la question), cette approche ne va pas travailler.

La classe Page est ce qui implémente le cycle de vie de la page ASP.Net. C'est une implémentation de IHttpHandler. La méthode ProcessRequest() de l'objet Page déclenche le cycle de vie de la page - FrameworkInitialize(), Init() ... jusqu'à OnLoadComplete(), OnSaveStateComplete().

La construction d'un objet page en appelant son constructeur n'invoque pas le cycle de vie de la page.

Questions connexes