begin process at 2012 02 05 01:17:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

ASP.Net

 > RECUPERER LA PAGE SANS LA MASTER PAGE ASSOCIÉ

RECUPERER LA PAGE SANS LA MASTER PAGE ASSOCIÉ


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :17 716

Auteur : jesusonline

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

 Sources du même auteur

Source avec Zip Source .NET (Dotnet) UTILISATION DE LA MÉTHODE SORT ET SORTDIRECTION AVEC UN GRID...
Source .NET (Dotnet) RESPONSE.FILTER : MANIPULATION DU STREAM DE SORTIE ASP.NET
Source avec Zip Source .NET (Dotnet) OPTIMISATION DE LA SERIALISATION JSON POUR LES LIST<T>
Source avec Zip Source .NET (Dotnet) CRAWLABLELINKBUTTON : UPDATEPANEL ET RÉFÉRENCEMENT
Source .NET (Dotnet) POSTBACKCONTROL - COMMUNICATION CLIENT/SERVEUR AVEC LES UPDA...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) GUESTBOOK AVEC GRIDVIEW par DanMor498
Source avec Zip CHECKED DROPDOWNLIST par fredzool
Source avec Zip Source avec une capture Source .NET (Dotnet) GRIDVIEW WITH TREEVIEW AND CALLBACK par fredzool
Source avec Zip APPELLER UN WEBSERVICE DEPUIS JAVASCRIPT par fredzool
Source avec Zip Source .NET (Dotnet) MONEY TEXTBOX WITH EMBEDED JAVASCRIPT par fredzool

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) PAGINATION CONTRÔLE REPEATER ASP.NET AVEC UN DATASET par fabienfs
Source avec Zip Source avec une capture Source .NET (Dotnet) UN SEMBLANT DE MASTERPAGE POUR DES FICHIERS XSL par bizzard4
Source .NET (Dotnet) LISTER TOUS LES CONTROLS D'UNE PAGE par Coolpix08
Source avec Zip Source avec une capture Source .NET (Dotnet) WEB PAGE SCREENSHOT CAPTURE D'ÉCRAN DE PAGES WEB par badrbadr
Source avec Zip Source .NET (Dotnet) EMPÊCHER LES ERREURS DES USERSCONTROLS DE FAIRE PLANTER TOUT... par Nurgle

Commentaires et avis

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>

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

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)

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

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.

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

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

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.

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. ^^

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

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

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

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 ... ;-)

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

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,186 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales