Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

HANDLER PERMETTANT DE FAIRE UNE REQUETE SUR LES USERCONTROL - LES FICHIER ASCX


Information sur la source

Catégorie :ASP.Net Source .NET ( DotNet ) Classé sous : handler, requête, usercontrol, ascx Niveau : Expert Date de création : 03/10/2005 Date de mise à jour : 06/10/2005 19:20:12 Vu : 13 223

Note :
8,33 / 10 - par 3 personnes
8,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note


Description

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

  • 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;
  • }
  • }
  • }
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 :)
 

Historique

03 octobre 2005 16:25:40 :
changement de catégorie de la source
03 octobre 2005 17:58:20 :
oups - petite erreur, merci Aurélien :)
03 octobre 2005 20:41:44 :
Orthographe - Nurgle tais toi ;)
04 octobre 2005 00:47:23 :
-
06 octobre 2005 18:48:20 :
Rajout de l'erreur 404 si on demande un fichier invalide.
06 octobre 2005 19:20:12 :
-

Commentaires et avis

signaler à un administrateur
Commentaire de sebmafate le 03/10/2005 13:45:28 administrateur CS

<Mode GrosLourd="on">
Oué... c nul j compren ri1 !!!
</ModeGrosLourd>

nan... sans déc... c'est nickel... on bientot avoir un nouveau Framework... le Cyril 1.0

signaler à un administrateur
Commentaire de jesusonline le 03/10/2005 13:53:36 administrateur CS

"on bientot" toi bien parler france ;)

signaler à un administrateur
Commentaire de sebmafate le 03/10/2005 13:57:53 administrateur CS

ooops... surcharge cérébrale :)
c'est ce qui arrive quand le cerveau tourne plus vite que les doigts :/



:P

signaler à un administrateur
Commentaire de tikrimi le 03/10/2005 15:16:29

Première remarque... change le niveau de la source, j'aime pas me faire traiter de débutant parceque je dois lire plusieurs fois la source avant de la comprendre ;-)
Deuxième remarque, ça fait longtemps que je n'avais pas utilisé de Handler (depuis que je ne bosse plus sous J2EE en fait)... j'en ai déclaré un hier avec Ajax, et aujourd'hui tu me montres comment faire les siens déjà ça c'est cool.
Pour la fonctionnalité, ben moi pour l'instant c'est pas certain que ça puisse me servir et je ne savais même pas que l'interface IUCStandAlone existait... ça doit être u truc réservé aux amateurs du "ClientSide" ça ;-) ... allé pas de 10 parceque j'ai du faire du copier/coller

signaler à un administrateur
Commentaire de jesusonline le 03/10/2005 16:19:21 administrateur CS

l'interface IUCstandAlone c'est moi qui la définit :)

Je vais changer le niveau de la source c'est vrai que ca c'est plus de débutant, mais plutot du débutant avertis ;)

signaler à un administrateur
Commentaire de Nurgle le 03/10/2005 20:24:55 administrateur CS

Très joli en effet :)
c'est vrai que niveau débutant c'était un peu...optimiste.
Tiens, j'avais pas remarqué : c'est en C# !! (toi qui nous fait d'habitude du joli vb.net, ça change un peu, lol)

<ModeGrosLourd id="le gros lourd, 2ème du nom">
"j'attend vos commentaire :)" il manquerait pas un truc à la fin d'un mot :p ? (je ne sais pas ce que j'ai en ce moment, je m'acharne sur les et/ou tes fautes d'orthographes :p)
</ModeGrosLourd>

signaler à un administrateur
Commentaire de jesusonline le 03/10/2005 20:45:11 administrateur CS

et oui du C# :p

depuis que je fais beaucoup de js, j'écrit intuitivement du C# ... :'( ils m'ont eu moi aussi :D

Sinon Nurgle, ca fait 2 fois en 2 jours ;) A croire qu'il faut vraiment que je prenne des cours :) (une jolie jeune fille douée en langue passe t'elle par là ?)

signaler à un administrateur
Commentaire de mami17 le 06/03/2007 20:23:43

salut quelles sont l'utilité de la mise en cache

signaler à un administrateur
Commentaire de mami17 le 06/03/2007 20:24:35

salut jesusonline  tu peux me dire comment je peux manipuler le usercontrole dans un webform a part le glissage de usercontrole en vb please

signaler à un administrateur
Commentaire de jesusonline le 06/03/2007 21:27:37 administrateur CS

Page.LoadControl("monUC.ascx") ?

signaler à un administrateur
Commentaire de mami17 le 07/03/2007 14:05:28

salut j'ai pas comprix cette methode page.loadcontrol("kl.ascx") je le fais mais quand je veux extraire le text d'un textbox je ne peux pas

signaler à un administrateur
Commentaire de Seb_d_angers le 14/08/2007 14:43:59

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

signaler à un administrateur
Commentaire de jesusonline le 14/08/2007 15:11:13 administrateur CS

Je ne vois pas de raisons pour que les variables de sessions ne soient pas lisible. tout devrais fonctionner. As tu une erreur ?

signaler à un administrateur
Commentaire de marchanddesable le 03/04/2008 17:41:47

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 -_-

signaler à un administrateur
Commentaire de jesusonline le 03/04/2008 19:32:01 administrateur CS

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 :))

signaler à un administrateur
Commentaire de marchanddesable le 03/04/2008 19:57:20

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 !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Accéder à la méthode d'un usercontrols à partir d'un autre usercontrol [ par geckoqc ] Bonjour, j'ai une page aspx (intro.aspx). Dans cette page intro.aspx, j'ai deux controls control1.ascx et control2.ascx Je voudrais, dans le code d AjaxControlToolKit - ModalPopupExtender dans un ascx [ par greedium ] Bonjour,J'ai un problème dont je n'arrive pas à trouver de réference sur le Web...J'ai un ModalPopup AJAX dans un UserControl (ascx) qui est lui meme WebParts L'ajout d'image ne s'affiche pas [ par sspizer ] Bonjour Je développe actuellement une page ASP.net qui est composé de webpart. Le but est d'afficher les photos dans une webpart et de pouvoir les or Charger une page HTML dans un UserControl [ par aztcaLISS ] Est-ce qu'il est possible de charger une page HTML dans un UserControl quand celui-ci load.Si oui, comment?merciazt MasterPage et UserControl [ par clemmat ] Bonjour,voici mon problème.Dans mon projest ASP, j'ai une MasterPage.Un UserControl est inséré dans une page de contenu.J'aimerai savoir s'il est poss Comment accéder à un UserControl à partir d'un Repeater [ par deeloc_015 ] Bonjour à tous,voilà en fait, je souhaiterai savoir comment faire pour accéder aux propriétés de mon UserControl que j'ai placé dans le ItemTemplate d requête [ par nicomilville ] Bonjour tout le mondeje récupère des donées d'une base de données à l'aide de requête sql dans une page! Et je voudrai les afficher dans des textbox d Concaténation dans une requête SQL [ par tataye ] Bonjour tout le monde,Pour schématiser, j'ai une table avec deux champs comme suit :Champ1 Champ2aaa         test1aaa         test2bbb        test3aaa OutputCache dans un user control [ par aloisio11 ] Bonjour, Peut-on faire un &lt;%@OutputCacheDuration="60"VaryByParam="no Communication Entre userciontrol et page [ par fouedelapoche ] Bonjour,ma question est assez simple : je voudrais utliser dans un usercontrol une variable définis dans une page (pas une master page)?j'ai bien pens


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,780 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.