ASP.Net fournit des skins de thème, qui sont en fait des changements de skin. Cependant, de nombreuses personnes sur Internet disent que cette chose est inutile, affirmant que cette chose peut être utilisée dans les pages .aspx, mais ne peut pas être utilisée dans les pages maîtres (MasterPage). Oui, il est vrai que vous ne pouvez pas changer directement le thème de l'ensemble du site Web via une sélection DDL dans MasterPage, car la propriété Page.Theme est définie dans PreInit(){}, sinon une erreur sera signalée et MasterPage ne s'exécutera pas. PréInit().
J'espère que cet exemple pourra aider tout le monde à résoudre ce problème. Afin que tout le monde puisse mieux comprendre mon code source, je vais le présenter brièvement ci-dessous.
Parlons d'abord de l'idée : notre but est de mettre une DropDownList dans la MasterPage, en changeant la DropDownList (je n'utilise pas DropDownList ici, mais j'utilise Css pour simuler une "DropDownList" dans laquelle un LinkButton est placé dans chaque élément, et chaque LinkButtond La valeur de PostBackUrl est sous la forme : "~/ThemeTool.aspx?Theme=theme name" ) pour changer le thème de l'ensemble du site, au lieu de simplement changer la page actuelle, tout comme celle de Discuz !, donc ce changement est global, mais c'est pour le thread actuel, c'est-à-dire que l'utilisateur A change le thème, ce qui n'est efficace que pour l'utilisateur A et n'a aucun impact sur l'utilisateur B, nous ne toucherons donc pas au fichier de configuration. Ensuite, ce que nous ferons. pensez rapidement à votre session. Oui, nous devons mettre le nom du thème dans la session, par exemple Session["Theme"]="Blue"; de cette manière, chaque page n'a besoin que d'obtenir la valeur de la session. Page_PreInit() et attribuez-le à l'attribut Page.Theme de la page, et tout ira bien.
Lorsque nous modifions l'option "DropDowList", ici je clique en fait sur un autre bouton Link, ce qui signifie changer le nom du thème, ce qui signifie changer la valeur de Session["Theme"]. C'est très critique. Est-ce dans LinkButton_Click() ? Non, car la réacquisition de Page.Theme doit être dans Page_PreInit() et LinkButton_Click() se produit très tard, après Load, sans parler de PreInit(), donc je passe ici à ThemeTool Processed in .aspx, puis je suis redirigé vers la page d'origine. après le traitement, afin que la valeur de Session["Theme"] soit modifiée avant PreInit() de la page d'origine. Soyez assuré que ce processus ne provoquera pas le chargement de ThemeTool dans le navigateur. je viens d'emprunter son Page_PreInit() et je suis parti immédiatement après l'avoir utilisé, haha ! !
Bon, c'est l'idée, présentons les trois fichiers suivants :
1. MasterPage.master, ce qui mérite d'être mentionné dans ce fichier est ma "DropDownList" simulée avec CSS. Chaque élément de la "DropDownList" a un LinkButton, et la valeur du PostBackUrl de chaque LinkButtond est sous la forme : " ~/ThemeTool. aspx?Theme=Theme name", de sorte que chaque fois que l'option "DropDownList" est modifiée, une nouvelle valeur de thème sera transmise à ThemeTool.aspx, puis ThemeTool.aspx traitera la nouvelle valeur de thème et la stockera dans la session. .
2. Il existe un fichier ThemeSkin.cs dans le dossier App_Code, qui contient deux méthodes statiques : GetTheme(Page P) et GetTheme(Page P) est utilisée pour obtenir le thème. Cette méthode se trouve sur le site Web. . Il est appelé dans Page_PreInit() de chaque page qui doit avoir un thème (je suis ici Default.aspx et Default2.aspx l). Le paramètre P fait référence à la page qui appelle la méthode, qui est un objet de type Page ; ChangeTheme() est utilisé pour changer de thème et est appelé dans Page_PreInit() de ThemeTool.aspx.cs.
3. La page ThemeTool.aspx dans le répertoire racine est également très importante. Le changement de thème se fait dans son Page_PreInit. Qui a dit à MasterPage de ne pas exécuter PreInit ? Le code à l’intérieur est très simple. Si vous ne me croyez pas, jetez un œil.
Développer