Handler permettant de faire une requete sur les usercontrol - les fichier ascx

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 995 fois - Téléchargée 27 fois

Contenu du snippet

Cette source permet de faire une requete sur un ascx, ceci grace à un handler.

Vous pourrez donc faire une requete de ce style : http://localhost/UC/hour.ascx et cela vous affichera le controle.

J'ai fait ceci pour pouvoir mettre à jour un UC dans une page par ajax.

Si vous utilisez dans votre UserControl des controles qui font un postback, attention a bien mettre le render entre des balises <form>, et de ne pas rajouter de controle faisant des postbacks, sinon aprés mis à jour dans votre page votre postback ne fonctionnera pas.

Dans ce cas, le postback est un coin délicat, si vous voulez utilisez cette technique avec postback, il faudra faire attention. Pour pouvoir utiliser le postback, j'ai du court-circuiter la vérification que le controle se trouve bien dans une balise form. Ceci en surchargeant la méthode VerifyRenderingInServerForm.

Ceci est un handler, vous devez donc compilez le code dans une dll, le mettre dans votre dossier bin de l'application et déclarer l'handler dans le web.config de cette facon :

<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.ascx" type="CSLib.Web.HTTPHandler.UserControl, CSLib.Web" validate="true"/>
...
</httpHandlers>

dans l'attribut type, le premier paramètre correspond au chemin de la classe, et le deuxieme paramètre correspond au nom de l'assembly (generalement le nom de la dll sans le .dll)

Pour des raisons de sécurité, si vous voulez avoir le rendu d'un ascx, il faut que ce UserControl implemente l'interface

public interface IUCStandAlone
{
Boolean isStandAlone
{
get;
}
}

Source / Exemple :


using System;
using System.Web;
using System.Web.UI;
using System.IO;

namespace CSLib.Web.HTTPHandler
{
    class UserControl : Page, IHttpHandler
    {
        public UserControl()
        {
            this.Init += new EventHandler(UserControl_Init);
        }

        /// <summary>
        /// On vérifie que derriere la requete se cache bel et bien un UserControl 
        /// puis que l'UC implemente bien l'interface permettant de voir le controle seul, pour des raisons de sécurités
        /// on ajoute le controle à la page
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void UserControl_Init(object sender, EventArgs e)
        {
            if (new FileInfo(this.Request.PhysicalPath).Exists)
            {
                System.Web.UI.UserControl UC =
                    (System.Web.UI.UserControl)this.LoadControl(this.Request.AppRelativeCurrentExecutionFilePath);
                if (UC is IUCStandAlone)
                {
                    IUCStandAlone StandAloneUC = (IUCStandAlone)UC;
                    if (StandAloneUC.isStandAlone)
                        this.Controls.Add(UC);
                    else
                        throw new HttpException(404, this.Request.Path + " not found");
                }
                else
                    throw new HttpException(404, this.Request.Path + " not found");

            }
        }

        public override void VerifyRenderingInServerForm(Control control)
        {
            // cette méthode sert à vérifier si la collection de controle de la page
            // peuvent faire des postbacks, si oui il faut absolument pour faire un postback
            // une balise <form> sinon cela declenche une erreur. 
            //
            // En faisant une méthode une vide, on annule la vérification.
        }

        /// <summary>
        /// On vérifie que le fichier, existe sinon on envoie une erreur 404
        /// </summary>
        /// <param name="context"></param>
        public override void ProcessRequest(HttpContext context)
        {
            if (!new FileInfo(context.Request.PhysicalPath).Exists)
                throw new HttpException(404, context.Request.Path + " not found");   

            base.ProcessRequest(context);
        }
    }

    public interface IUCStandAlone
    {
        Boolean isStandAlone
        {
            get;
        }
    }
}

Conclusion :


j'attend vos commentaires :)

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
3 avril 2008

LOL effectivement en ajoutant les bonnes interfaces ça fonctionne, genial : )

En ce qui concerne context.RewritePath j' y ai pensé juste après avoir posté le message.. mais j' ai jamais utilisé ça hum, j' ai testé en remplaçant mon server.transfert par rewritePath mais il se passe rien hum ( la page est blanche ), je vais fouiner un peu.

Thanks !
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Pourquoi utiliser Server.Transfer alors que les httpmodules avec la méthode context.RewritePath (je suis pas sur du tout là :p) permet de faire du rewriting ? En plus ce sera plus performant :)

Sinon pour le problème de session, il faut que ton handler implémente IRequireSessionState ou IReadOnlySessionState qui sont des interfaces "marqueurs" (là encore pas sur du nom des interfaces :))
Messages postés
2
Date d'inscription
lundi 29 décembre 2003
Statut
Membre
Dernière intervention
3 avril 2008

Petite question au sujet du code, il fonctionne, mais il y a un problème si l' UC utilise les sessions:

Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>\<system.web>\<httpModules> section in the application configuration.

Une idée pour remédier à ce problème ?
Apparemment c' est un problème connu mais je n' ai pas trouvé de réponse... et puis je n' ai vu personne qui chargeait les UC de cette maniere aussi.. vu que c' est fait maison :)

Note: j' ai bien le sessionstate activé dans le web.config.

En fait j' ai un page avec plusieurs UC, je voudrai que certains de ces UC soient mis à jour par AJAX a interval regulier ( timer ).
Je précise que dans mon site j' utilise de l' URLrewriting avec HTTPHandler.

J' ai donc du abandonner l' idee d' utiliser les composants du plugin AJAX .NET ( update panel et compagnie ) car ça pose problème avec la fonction server.transfer .. or quand j' appelle une page du style toto.html, du coté handler elle est transformee en toto/tutu/machin.aspx avec un server.transfer

Alors il me faudrait soit trouver une parade à ce problème, soit faire fonctionner ce code avec les sessions -_-
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Je ne vois pas de raisons pour que les variables de sessions ne soient pas lisible. tout devrais fonctionner. As tu une erreur ?
Messages postés
155
Date d'inscription
vendredi 2 novembre 2001
Statut
Membre
Dernière intervention
19 mai 2011

Y a t il une issue pour lire les variables de session quand on utilise ce handler ?
Afficher les 16 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.