2008-08-18 7 views
8

Je travaille sur un site qui doit pouvoir prendre en charge deux ou plusieurs aspects, modifiables lors de l'exécution. J'avais espéré pouvoir manipuler le changement avec un commutateur de CSS, mais il semblerait que je devrais employer une page principale différente pour chaque conception.Définition d'une page maître ASP.NET au moment de l'exécution

Alors, quelle est la meilleure façon de définir la page maître lors de l'exécution? Page.MasterPageFile peut uniquement être défini dans l'événement Page.OnPreInit. Il semble que les solutions consistent à faire hériter toutes mes pages d'une base commune qui gère l'événement PreInit, ou à utiliser un HttpModule qui le fait.

Un conseil?

Répondre

6

Je l'ai fait une fois avant, j'ai fait exactement ce que vous avez décrit (Fait toutes les pages héritent d'une page personnalisée avec un événement OnPreInit). J'ai également eu un Application_PreRequestHandlerExecute personnalisé dans mon Global.asax.cs pour définir Page.StyleSheetTheme pour effectuer des modifications d'image/css qui n'ont pas nécessité une page principale différente.

2

Au lieu de deux pages maîtres différentes, pourquoi ne pas avoir un maître qui charge dynamiquement différents contrôles utilisateur et des littéraux HTML de contenu?

1

Il est assez facile de gérer PreInit et d'insérer la ligne de code nécessaire pour charger la bonne page.

this.Page.MasterPageFile = "~/default.master"; 

En l'absence d'une raison impérieuse de ne pas aller dans cette voie, c'est ce que je ferais, peu importe où vous manipulez la PreInit.

0

Je suis curieux de savoir à quoi ressemblera la page? Est-ce l'utilisateur qui clique sur un bouton pour changer de thème? Est-ce basé sur l'URL qui a été utilisée pour accéder au site?

Le code derrière est pris en charge dans les pages maîtres, de sorte que vous pouvez mettre un peu de logique dans votre page principale pour décider ce qui doit être affiché. J'ai vu plusieurs sites configurer des cookies en fonction des clics de l'utilisateur (pour changer la taille de la police ou la largeur de la page), puis appliquer différents fichiers CSS en fonction de la valeur de ces cookies. Si aucun cookie n'est présent, affichez un aspect et une convivialité par défaut.

EDIT:

Une autre pensée ici, si vous essayez simplement de passer des CSS est de définir votre balise de style à exécuter sur le serveur, et affecter des propriétés à elle lors de l'exécution. Encore une fois, cela nécessiterait l'utilisation d'une seule page maître et la mise en code du code derrière la page maître, probablement dans le gestionnaire d'événements PreInit.

Comme je n'ai jamais implémenté cette solution, je ne suis pas sûr que la balise <HEAD> soit exécutée sur le serveur ou non.


<html> 
<head id="Head" runat="server"> 
<style id="StylePlaceholder" runat="server" type="text/css"></style> 
</head> 
2

Je ressens votre douleur. J'ai cherché environ une heure (sinon plus) pour un problème à ceci, sans succès. Ce n'est pas juste une réponse sèche et sèche de dire «appelez-le simplement à partir de PreInit sur chaque page» lorsque vous avez des centaines de pages. Mais ensuite, j'ai réalisé que je passais plus de temps à chercher une solution que ce qu'il aurait fallu faire sur chaque page.

Cependant, je voulais définir le MasterPageFile basé sur une propriété de profil, de sorte qu'il aurait été environ 5 lignes de code chaque page, un cauchemar de maintenabilité. Et de toute façon, "ne te répète pas", n'est-ce pas?

J'ai donc créé une méthode d'extension dans un module du dossier App_Code pour le rendre plus facile et plus facile à gérer.

Public Module WebFunctions 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub SetMaster(ByVal page As Page) 

     Dim pb As ProfileCommon = DirectCast(HttpContext.Current.Profile, ProfileCommon) 

     If pb IsNot Nothing Then 
      page.MasterPageFile = pb.MasterPage 
     End If 

    End Sub 

End Module 

Et puis, je viens d'appeler le PreInit de chaque page ceci:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
     Me.SetMaster() 
    End Sub 
0

vous viennent toutes les pages d'une classe de base comme

public class PageBase : System.Web.UI.Page 
{ 
    public PageBase() 
    { 
     this.PreInit += new EventHandler(PageBase_PreInit); 
    } 
    void PageBase_PreInit(object sender, EventArgs e) 
    { 
     this.MasterPageFile = "~/MyMasterPage.Master"; 
    } 
} 
Questions connexes