2009-07-07 5 views
0

J'écris un gestionnaire HTTP personnalisé pour fournir un formulaire d'édition pour une grille en utilisant les contrôles utilisateur existants. Fondamentalement, mon gestionnaire crée la page, le formulaire, l'en-tête et les autres contrôles nécessaires pour rendre les contrôles utilisateur existants correctement et à la fin de ProcessRequest, j'utilise Server.Execute pour exécuter la page qui a été créée dynamiquement. Je fais ceci parce que la solution où ceci réside est un projet de contrôles d'utilisateur et il n'y a aucune page, et nous ne pouvons pas ajouter n'importe lequel. Cela doit être réutilisable pour plusieurs projets.Comment obtenir un IHttpHandler personnalisé capable de gérer les publications?

Cela fonctionne très bien jusqu'au point où les contrôles utilisateur ajoutés à cette "page" nécessitent l'utilisation du mécanisme de publication. Dans le contrôle utilisateur Page.IsPostBack est toujours faux et les événements de contrôle (comme un clic sur un bouton) ne sont pas gérés. Il est évident qu'il me manque un morceau critique de la façon dont une page ASP.NET typique fonctionne. La classe Page est juste une implémentation d'un IHttpHandler, mais il y a beaucoup de code qui ne devrait pas être nécessaire pour que la fonctionnalité de base fonctionne ici.

Des idées?

Voici le code de base de mon gestionnaire HTTP de base. J'ai d'autres classes qui héritent de ce gestionnaire de base pour ajouter les contrôles utilisateur réels à la forme de la page.

public void ProcessRequest(HttpContext context) { 
     context.Response.ContentType = "text/html"; 

     HtmlGenericControl htmlPage = GetHtml(); 
     AddTitle(); 
     htmlPage.Controls.Add(_head); 

     HtmlGenericControl htmlBody = GetBody(); 

     _form.Action = context.Request.Url.ToString(); 
     _form.Method = "POST"; 
     htmlBody.Controls.Add(_form); 

     htmlPage.Controls.Add(htmlBody); 

     AddAjaxManager(); 
     AddScriptManager(); 

     _page.Controls.Add(htmlPage); 
     //_page.ProcessRequest(context); 

     context.Response.CacheControl = "No-Cache"; 
     context.Server.Execute(_page, context.Response.Output, true); 
    } 

    public bool IsReusable { get { return false; } } 

Répondre

0

Pour que cela fonctionne, j'ai hérité de Page au lieu d'implémenter IHttpHandler. Vous devez tout de même créer l'ensemble du code HTML de la page, mais vous bénéficiez de toute la splendeur (ou non) du cycle de vie de la page ASP.NET WebForms lorsque vous effectuez cette opération.

Questions connexes