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

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

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.