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 :
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 :
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
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
<%@ Page Language="C#" MasterPageFile="~/MaMaster.Master" AutoEventWireup="false" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %>
Partager