Question

Je suis en train d'écrire un gestionnaire HTTP personnalisé pour fournir une forme d'édition pour une grille à l'aide des contrôles utilisateur existants. En fait, mon gestionnaire crée la page, la forme, en-tête, et d'autres contrôles nécessaires pour être en mesure de 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éé dynamiquement. Je fais cela parce que la solution où cela réside est un projet de contrôle de l'utilisateur et il n'y a pas de pages, et nous ne pouvons ajouter tout. Cela doit être réutilisable pour plusieurs projets.

Cela fonctionne très bien jusqu'au moment où les contrôles utilisateur ajoutés à cette « page » nécessitent l'utilisation du mécanisme de publication. Dans le Page.IsPostBack de contrôle utilisateur est toujours faux événements et de contrôle (comme un bouton clic) ne sont pas traitées. Il est évident que je manque une pièce essentielle de la façon dont une page ASP.NET typique fonctionne. La classe Page est juste une mise en œuvre d'un IHttpHandler, mais il y a beaucoup de code que je ne pense pas que devrait être nécessaire pour obtenir la fonctionnalité de base pour travailler ici.

Toutes les 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; } }
Était-ce utile?

La solution

Pour faire ce travail, je hérité de la page au lieu de la mise en œuvre IHttpHandler. Vous ne devez toujours construire sur l'ensemble du code HTML de la page, mais vous obtenez tous les wonderfulness (ou non) du cycle de vie de la page ASP.NET WebForms quand vous faites cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top