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 !

RECUPERER LA PAGE SANS LA MASTER PAGE ASSOCIÉ


Information sur la source

Catégorie :ASP.Net Source .NET ( DotNet ) Classé sous : page, masterpage, contentplaceholder, placeholder Niveau : Initié Date de création : 05/10/2005 Date de mise à jour : 05/10/2005 15:12:37 Vu : 14 542

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

Dans la meme optique que cette source : http://www.aspfr.com/code.aspx?ID=34070, j'avais besoin de recuperer le contenu de la page sans le masterpage associé.

imaginons que vous avez une page default.aspx et une master page, default.master, dans default.master vous avez des UserControl un peu de partout car commun a toutes les pages, et dans default.aspx vous avez juste le texte "bonjour le monde". Quand vous allez sur http://localhost/default.aspx, le texte "bonjour le monde" ainsi que tous les userControl du master apparait. Ce que vous avez envie vous c'est de recuperer juste "bonjour le monde", donc annuler la masterPage.

La solution est assez simple, il suffit de créer une classe dérivant de System.Web.UI.page, et ensuite de faire dériver vos page de cette nouvelle classe.

Qu'apporte en plus cette nouvelle classe ?

2 propriétés :
RenderOnlyPage (boolean) : si elle est vrai, alors la page ne comportera pas le masterpage
RenderOnlyOneContentPlaceHolder (string) : il faut spécifier le contentPlaceHolderID que vous voulez afficher, par défaut la propriété est à string.Empty, et cela affichera tout les ContentPlaceHolder


La classe fonctionne simplement, dans le page_init, je regarde si on doit afficher le master, si non, je vais parcourir recursivement tout les controls de la page, et je vais supprimer tout ce qui n'est pas ContentPlaceHolder.

Comme sur ma précedente source j'ai surchargé VerifyRenderingInServerForm pour ne pas être embeté avec l'absence de balise form.


Pour se servir de la classe c'est bien simple, faites dériver vos pages de CSLib.Web.UI.Page

public partial class Default : CSLib.Web.UI.Page
{

    protected void page_PreInit(object sender, EventArgs e)
    {
       Boolean RenderOnlyPage = false;
       Boolean.TryParse(Request.QueryString["nomaster"], out RenderOnlyPage);
       this.RenderOnlyPage = RenderOnlyPage;
       this.RenderOnlyOneContentPlaceHolder = "ContentPlaceHolder1";
    }
}

dans ce cas, si ma requete est default.aspx la page entiere va s'afficher (avec la masterpage) et si la requete est default.aspx?nomaster=true, la page s'affichera sans le masterpage :)
 

Source

  • using System;
  • using System.Collections.Generic;
  • using System.Text;
  • using System.Web.UI;
  • namespace CSLib.Web.UI
  • {
  • public class Page : System.Web.UI.Page
  • {
  • #region "Constructor"
  • public Page()
  • {
  • this.Init += new EventHandler(Page_Init);
  • }
  • #endregion
  • #region "Property"
  • private Boolean renderOnlyPage = false;
  • /// <summary>
  • /// if true, the page would render only ContentPlaceHolder
  • /// </summary>
  • public Boolean RenderOnlyPage
  • {
  • get { return renderOnlyPage; }
  • set { renderOnlyPage = value; }
  • }
  • private string renderOnlyOneContentPlaceHolder = string.Empty ;
  • public string RenderOnlyOneContentPlaceHolder
  • {
  • get { return renderOnlyOneContentPlaceHolder; }
  • set { renderOnlyOneContentPlaceHolder = value; }
  • }
  • #endregion
  • /// <summary>
  • /// List of ContentPlaceHolder
  • /// </summary>
  • private List<Control> _Control = new List<Control>();
  • void Page_Init(object sender, EventArgs e)
  • {
  • if (RenderOnlyPage)
  • {
  • // parcours récursif sur tous les controles de la page
  • CheckContentPlaceHolderRecursive(this);
  • // suppression de tous les controles de la page
  • // pour ensuite rajouter nos contentPlaceHolder
  • this.Controls.Clear();
  • foreach (Control c in _Control)
  • this.Controls.Add(c);
  • }
  • }
  • /// <summary>
  • /// fonction recursive, qui fouille dans les controles de la page pour trouver
  • /// un ContentPlaceHolder
  • /// </summary>
  • /// <param name="control"></param>
  • private void CheckContentPlaceHolderRecursive(Control control)
  • {
  • if (control is System.Web.UI.WebControls.ContentPlaceHolder)
  • {
  • if (RenderOnlyOneContentPlaceHolder == string.Empty )
  • _Control.Add(control);
  • else if (control.ID == RenderOnlyOneContentPlaceHolder)
  • _Control.Add(control);
  • }
  • else if (control.Controls.Count > 0)
  • foreach (Control c in control.Controls)
  • CheckContentPlaceHolderRecursive(c);
  • }
  • /// <summary>
  • /// Cette méthode déclenche un evenement, si un control ayant besoin d'une balise form
  • /// (c'est le cas des controles avec postback) est absent.
  • /// En surchargeant cette méthode on passe outre cette limitation.
  • /// </summary>
  • /// <param name="control"></param>
  • public override void VerifyRenderingInServerForm(Control control)
  • {
  • if (!RenderOnlyPage)
  • base.VerifyRenderingInServerForm(control);
  • }
  • }
  • }
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;

namespace CSLib.Web.UI
{
   public class Page : System.Web.UI.Page
   {

       #region "Constructor"
       public Page()
        {
            this.Init += new EventHandler(Page_Init);
        }
       #endregion

       #region "Property"

       private Boolean renderOnlyPage = false;
       /// <summary>
       /// if true, the page would render only ContentPlaceHolder
       /// </summary>
       public Boolean RenderOnlyPage
        {
            get { return renderOnlyPage; }
            set { renderOnlyPage = value; }
        }

       private string renderOnlyOneContentPlaceHolder = string.Empty ;
       public string RenderOnlyOneContentPlaceHolder
       {
            get { return renderOnlyOneContentPlaceHolder; }
            set { renderOnlyOneContentPlaceHolder = value; }
       }
	

       #endregion

       /// <summary>
       /// List of ContentPlaceHolder
       /// </summary>
       private List<Control> _Control = new List<Control>();

        void Page_Init(object sender, EventArgs e)
        {  
            if (RenderOnlyPage)
            {
                // parcours récursif sur tous les controles de la page
                CheckContentPlaceHolderRecursive(this);

                // suppression de tous les controles de la page
                // pour ensuite rajouter nos contentPlaceHolder
                this.Controls.Clear();
                foreach (Control c in _Control)
                    this.Controls.Add(c);
            }
        }

       /// <summary>
       /// fonction recursive, qui fouille dans les controles de la page pour trouver 
       /// un ContentPlaceHolder
       /// </summary>
       /// <param name="control"></param>
        private void CheckContentPlaceHolderRecursive(Control control)
        {
            if (control is System.Web.UI.WebControls.ContentPlaceHolder)
            {
                if (RenderOnlyOneContentPlaceHolder == string.Empty )
                    _Control.Add(control);
                else if (control.ID == RenderOnlyOneContentPlaceHolder)
                    _Control.Add(control);
            }
            else if (control.Controls.Count > 0)
                foreach (Control c in control.Controls)
                    CheckContentPlaceHolderRecursive(c);
        }

       /// <summary>
       /// Cette méthode déclenche un evenement, si un control ayant besoin d'une balise form
       /// (c'est le cas des controles avec postback) est absent. 
       /// En surchargeant cette méthode on passe outre cette limitation.
       /// </summary>
       /// <param name="control"></param>
       public override void VerifyRenderingInServerForm(Control control)
        {
            if (!RenderOnlyPage)
                base.VerifyRenderingInServerForm(control);
        }
    }
}

Conclusion

tout commentaire est bon à prendre :)
 

Historique

05 octobre 2005 15:12:38 :
nurgle - anti fot d'ortografe

Commentaires et avis

signaler à un administrateur
Commentaire de Nurgle le 05/10/2005 13:55:03 administrateur CS

Très bien effet, surtout qu'on peut étendre ta méthode à n'importe quel type de controles...
De qui recharger n'importe quel bout de ta page. Excellent !

<ModeGrosLourd FautesDOrthograpthe="ON">
"tous commentaires est bon à prendre"
soit tu mets :
- tout commentaire est bon à prendre
ou alors :
- tous commentaires sont bons à prendre
(décidément, j'arrête pas...:p)
</ModeGrosLourd>

signaler à un administrateur
Commentaire de Nurgle le 05/10/2005 13:57:29 administrateur CS

Je critique, mais j'ai fait quand même deux fautes de frappe :
- Très bien "en" effet, ...
- De "quoi" recharger...

lol...

signaler à un administrateur
Commentaire de poppyto le 05/10/2005 14:30:11 administrateur CS

Il y a une technique beaucoup plus simple (il faut cependant que la page de contenu ne dépende pas d'un contrôle utilisateur):

1-Créer un master page vierge (BlankPage.master par exemple) vierge (juste le ContentPlaceHolder)

2-Dans Page_PreInit de la page : this.MasterPageFile = "~/BlankPage.master";

Et le tour est joué :) (éventuellement réimporter la CSS si présent dans le masterpage)

signaler à un administrateur
Commentaire de jesusonline le 05/10/2005 14:52:51 administrateur CS

Oui, j'avais aussi pensé à cette technique poppyto, mais ma facon est plus simple je trouve car pas besoin de créer une page blanche, et on peut facilement selectionner tel ou tel ContentPlaceHolder, alors qu'avec l'autre solution tu te trouveras avec plusieurs master vide ...

En plus dans quasi tous les sites normaux, on n'hérite pas la page directement de System.Web.UI.Page mais d'une autre page de sa création. donc cette solution est pour moi la plus simple a mettre en place :)

Nurgle : si tu continue je vais te donner le poste de correcteur d'orthographe de Cyril :D bon courage ;)

signaler à un administrateur
Commentaire de poppyto le 05/10/2005 15:12:49 administrateur CS

Ba personnellement je trouve ma technique plus simple (2 lignes !) mais incomplète par rapport à la tienne je l'admet :). Malgré tout, on utilise généralement ce genre de page pour proposer une version imprimable de la page. Donc on recréé souvent un master page pour rappeler le logo du site avant d'afficher le content holder.

signaler à un administrateur
Commentaire de jesusonline le 05/10/2005 15:51:04 administrateur CS

Oui dans ton cas d'accord. Moi j'ai fait ca pour rappeller la page via ajax, et l'inserer dans une autre page qui avait deja le master page :p

j'avais pas pensé à la solution pour faire une version imprimable, pour moi une version imprimable devrait se faire par la feuille de style print ...

signaler à un administrateur
Commentaire de poppyto le 05/10/2005 16:37:37 administrateur CS

En y réflechissant, la technique que je propose marche avec Ajax moyennant un paramètre GET dans l'URL (comme ce que tu fais finalement).

signaler à un administrateur
Commentaire de jesusonline le 05/10/2005 16:51:55 administrateur CS

Nos technique sont à peu prés équivalente,

toi tu changes de masterpage, ce qui veut dire que tu peux si besoin rajouter un logo ou "autre connerie" du genre, alors qu'avec ma technique c'est un poil plus compliqué

Mais ta technique entraine la création de nombreuse masterpage vide ! Alors que ma technique non. Et puis il n'y a pas grand chose de contraignant à ma technique, car dans tout les projets web, la premiere chose qu'on fait (en tout cas moi) c'est de créer une nouvelle classe page vers laquelle je fais hériter toutes mes autres pages.

Mais bon, on va pas faire la guerre sur quelle technique est la meilleure ;) les 2 sont bonnes à prendre, tout depend de l'utilisation qu'on en a derriere.

signaler à un administrateur
Commentaire de poppyto le 05/10/2005 17:03:30 administrateur CS

> Mais ta technique entraine la création de nombreuse masterpage vide !

Ba non ? une seule. ou une pour AJAX et une pour l'impression ^^ par exemple. Après toutes les pages doivent implémenter le Pre_Init (normal pour modifier le .MasterPageFile ).

>Mais bon, on va pas faire la guerre sur quelle technique est la meilleure ;)
>les 2 sont bonnes à prendre, tout depend de l'utilisation qu'on en a
>derriere.

Exact de toute façon, les CSharpiens s'aiment tous :). Je débats juste un peu sur ta source qui m'a paru intéressante. ^^

signaler à un administrateur
Commentaire de quineman le 17/07/2006 19:22:13

Bonjour,
Je suis actuellement en train d'intégrer un site en aspx 2.0 et j'utilise un masterpage. Je me permet d'intervenir sur ce topic car je souhaiterais savoir s'il est possible d'utiliser ce systeme de templates avec des pages en asp 3.0.
Par avance merci pour votre réponse

signaler à un administrateur
Commentaire de jesusonline le 17/07/2006 20:33:22 administrateur CS

ASP3 est obsolète ! tu pourrais peut etre faire la même chose mais je n'ai aucune idée de comment faire si ce n'est de passer sur du .net ...

signaler à un administrateur
Commentaire de battit64 le 04/12/2007 00:47:05

désolé mais je nage un peu sur le code, comment faire la meme chose mais en vb et non pas en C# avec les explications si possible
merci

signaler à un administrateur
Commentaire de jesusonline le 04/12/2007 01:05:20 administrateur CS

Bonjour, je te conseil de lire le code, il est vraiment très simple le travail est près maché ! Il suffit juste de faire un petit effort pour lire le code ... ;-)

signaler à un administrateur
Commentaire de battit64 le 04/12/2007 13:57:06

OK je vais essayé mais je suis novice en asp et par exemple j'ai du mal avec la conversion en vb
par exemple  
             private Boolean renderOnlyPage = false;
       /// <summary>
       /// if true, the page would render only ContentPlaceHolder
       /// </summary>
       public Boolean RenderOnlyPage
        {
            get { return renderOnlyPage; }
            set { renderOnlyPage = value; }
        }

ce sont des fonctions? pourquoi tu fais un dim renderOnlypage as boolean ) false et aprés un public boolean avec le get et le set à quoi ça correspond et comment tu transforme ça en vb.
Désolé je sais que pour toi ça semble logique mais je débute.
merci encore

signaler à un administrateur
Commentaire de BrunoCheyrou le 11/08/2008 16:14:36

Moi j'ai besoin d'imprimer un fiche detaillée avec les details sur un client. Chaque fiche detaille un client, le lien vers la page detaillée est toujours la même (bien sûr) avec un QueryStringParameter sur le num_auto de la table CLIENT. J'aimerai ajouter un Crystal Report sur cette page details.aspx qui permettetrait d'imprimer les details de n'importe quel client.

Pour effectuer ca, j'ai d'abord commencé par créer un DataSet avec mes 2 tables liées et sur la page details.aspx j'ai mi un CrystalReportViewer que j'ai lié avec le DataSet mais ensuite celà me créer un etat mais ce n'est pas ca dont j'ai besoin...

Quelqu'un aurait-il une démarche à suivre ?

Merci beaucoup

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Post entre ContentPlaceHolder d une masterpage [ par king_greg ] BonjourJe debute en ASP2Mon idee de depart est de creer une master page avec une liste deroulante contenant les nom des users de l active directoryJ a theme par defaut dans web.config [ par jimmy28 ] Salut à tous,Tout d'abord, je bosse sous VS2005.Lorsque je définis une masterpage par défaut dans le web.config, tout marche bien. Par contre je ne pe probleme masterPage et session [ par samkil ] Bonjour,  Peut on  recuperer et utiliser des données session dans une master page Mon probleme est le suivant : J'ai une banniere dans laquelle je doi MasterPage/ Menu / ContentPlaceHolder [ par David REI ] Bonsoir à tous!Je travaille actuellement sur un site Web en utilisant le framework Ajax ASP.NET. J'utilise une masterpage contenant une barre de navig MasterPage to Contenant [ par bizzard4 ] BonjourJ'ai le problème suivant : J'ai un masterPage qui load un dataSet à partir d'une base de données. Ce que je voudrais faire c'est de récupérer c Formulaire HTML dans ContentPlaceHolder [ par fredko ] Bonjour,J'ai une page .aspx avec un ContentPlaceHolder qui hérite d'un MasterPage.La page .aspx utilise donc un form &lt;form id="form1" runat="server MasterPage & Web Form [ par Tuizi ] Bonjour,Voila je voudrais mettre en place une master page.J'ajoute donc à mon projet une master page.Ensuite j'ajoute une Web Form ou je précise bien [c#]Appliquer la feuille de style d'une MasterPage dans un fichier aspx [ par ludo27600 ] bonjour,j'ai référencé une feuille de style dans la MasterPage d'un site :&lt;link rel="stylesheet" type="text/css" href=<spa Conversion en string [ par Ishizaki ] Hello tout le mondeVoilà, je suis en plein apprentissage de l'asp.NET avec Visual Web Developer, donc je débute pas mal en utilisant le C#.Je m'entraî Les pages se chargent 2 fois [ par zserge ] J'ai une masterpage avec une webform, puis 2 usercontrol sur la masterpage et un dans la webform.je met un point d'arrêt sur le "if(!IspostBack)" de c


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


HTC G1

Entre 449€ et 449€


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 : 1,014 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é.