IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Problème avec les évenements entre master et content pages


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 40
    Points : 34
    Points
    34
    Par défaut Problème avec les évenements entre master et content pages
    Bonjour,

    Je développe ma première application en asp.net.

    J'ai actuellement une "master page" et une "content page" liée à cette dernière.

    Dans ma "master page" j'ai un controle "ListBox" en "AutoPostBack". Donc lorsque je sélectionne un nouvel item dans la "ListBox" j'ai ma "content page" qui est rappelée.

    J'essaie alors d'appliquer une feuille de style à ma "content page" en fonction de l'item sélectionné dans ma "ListBox".

    Et je ne m'en sors pas... Pas encore assez initiée à .NET donc si quelqu'un pouvait m'éclarcir.

    En debuggant j'ai scruté l'enchainement des évenement:

    1. Page_Init de la "master page" :

    1.1 je construis ma "ListBox" si pas POSTBACK
    1.2 j'ajoute un "Context.Item" pour transmettre à ma "page content" l'item sélectionné

    2. Page_Load de la "content page" :

    2.1 je récupère le "Context.Item" et je choisis ma feuille de style en fonction

    3. Page_Load de la "master page" : ETONNANT ou plutôt DESAGREABLEMENT surpris que cet evenement arrive après le 2.

    TOUT CELA FONCTIONNE SI PAS POSTBACK donc au premier chargement.

    Ensuite je modifie l'item dans la "ListBox" et les évenements suivant sont suprenants...:

    4. Page_Init de la "master page" : mais comme POSTBACK je n'ai normalement pas besoin de reconstruire ma "ListBox"

    5. Page_Load de la "content page" : mais ma "ListBox" dans ma "master page" n'est pas encore accéssible donc la je suis bloqué pour récupérer l'item sélectionné et choisir ma feuille de style pour ma "content page"....

    6. Page_Load de la "master page"

    7. SelectedIndexChanged de la "ListBox" de ma "master page"

    Je pense ne pas tout avoir saisi... Je vous remercie par avance pour votre aide.

    Pierrick

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    il y a plein de facon de faire.

    Je t'en propose une en faisant tous les traitements dans la master page, sans utiliser de contexte.

    On va supposer que le viewstate est utilisé

    imaginons une masterpage de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    %@ Master Language="C#" AutoEventWireup="false" CodeBehind="MaMaster.master.cs" Inherits="WebApplication2.MaMaster" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
        <asp:ContentPlaceHolder ID="head" runat="server">
            <link rel="Stylesheet" type="text/css" runat="server" id="moncss" />
        </asp:ContentPlaceHolder>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                <asp:ListBox runat="server" ID="MaListe" AutoPostBack="true" OnSelectedIndexChanged="ItemChanged" />
            </asp:ContentPlaceHolder>
        </div>
        </form>
    </body>
    </html>
    On remarque notamment dans le ContentPlaceHolder "head" qu'il y a une balise link avec un runat server

    Et on constate dans le ContentPlaceHolder de la form, une listbox avec un AutoPostBack=true, et un événement associé au OnSelectedIndexChanged

    Selon tes souhaits, une alimentation dans le OnInit de la master page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected override void OnInit(EventArgs e)
    {
        if (!IsPostBack)
        {
            MaListe.Items.Add(new ListItem("Valeur 1", "Valeur 1"));
            MaListe.Items.Add(new ListItem("Valeur 2", "Valeur 2"));
            MaListe.Items.Add(new ListItem("Valeur 3", "Valeur 3"));
        }
        base.OnInit(e);
    }
    On va supposer qu'on a un répertoire Css dans lequel il y a trois css : Css1.css, Css2.css, Css3.css

    Lorsqu'on recoit l'événement, on a juste à rediriger vers le bon Css à utiliser et à le définir comme attributs de la balise link

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected void ItemChanged(object sender, EventArgs e)
    {
        string valeur = ((ListBox)sender).SelectedValue;
        string nomCss = string.Empty;
        if (valeur == "Valeur 1")
            nomCss = "~/Css/Css1.css";
        if (valeur == "Valeur 2")
            nomCss = "~/Css/Css2.css";
        if (valeur == "Valeur 3")
            nomCss = "~/Css/Css3.css";
     
        moncss.Attributes.Add("href", VirtualPathUtility.ToAbsolute(nomCss));
    }
    Il aurait pu etre élégant de créer une balise server qui gère le CSS, mais bon, ca marche très bien comme ca


    PS : la page fille doit donc utiliser la masterpage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Page Language="C#" MasterPageFile="~/MaMaster.Master" AutoEventWireup="false" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %>

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Merci pour ta solution, elle fonctionne très bien.

    Il me reste tout de meme quelques interrogations sur l'enchainement des évenements entre "master et content pages". J'ai l'impression que le Page_Load de la "content page" s'effectue avant le Page_Load de la "master page". Ce qui est embetant lorsque je veux récupérer une propriété d'un contrôle de la "master page" sur le Page_Load "content page". Ces propriétés n'étant pas accéssible avant le Page_Load de la "master page".

    Me trompe-je ?

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/11/2012, 14h24
  2. [RegEx] Problème avec les espaces entre deux tags
    Par elcoyotos dans le forum Langage
    Réponses: 9
    Dernier message: 17/04/2007, 11h01
  3. Problème avec les master page
    Par MayOL69bg dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/03/2007, 10h45
  4. j'ai un problème avec les évenement et les variables !!
    Par cvb dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/12/2005, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo