Domanda

Sto lavorando su un sito che deve essere in grado di supportare due o più look, modificabili in fase di esecuzione.Speravo di poter gestire la modifica con un'opzione CSS, ma sembra che dovrò utilizzare una pagina master diversa per ogni progetto.

Quindi, qual è il modo migliore per impostare la pagina master in fase di esecuzione?Page.MasterPageFile può essere impostato solo nell'evento Page.OnPreInit.Sembra che le soluzioni siano fare in modo che tutte le mie pagine ereditino da una base comune che gestisce l'evento PreInit o utilizzare un HttpModule che lo faccia.

Qualche consiglio?

È stato utile?

Soluzione

L'ho già fatto una volta, ho fatto esattamente quello che hai descritto (ho fatto in modo che tutte le pagine ereditassero da una pagina personalizzata con un evento OnPreInit).Inoltre avevo un Application_PreRequestHandlerExecute personalizzato nel mio Global.asax.cs per impostare Page.StyleSheetTheme per apportare modifiche all'immagine/css che non richiedevano una pagina master diversa.

Altri suggerimenti

Invece di due diverse pagine master, che ne dici di avere un master che carica dinamicamente diversi controlli utente e contenuti letterali HTML?

Condivido il tuo dolore.Ho cercato per circa un'ora (se non di più) un problema a questo problema, senza successo.Non è solo una risposta secca e secca dire "basta chiamarlo da PreInit su ogni pagina" quando hai centinaia di pagine.Ma poi mi sono reso conto che stavo dedicando più tempo alla ricerca di una soluzione di quanto ne avrei impiegato semplicemente su ogni pagina.

Tuttavia, volevo impostare MasterPageFile in base a una proprietà Profile, in modo che sarebbero state circa 5 righe di codice per pagina, un incubo in termini di manutenibilità.E comunque "non ripeterti", giusto?

Quindi ho creato un metodo Extension in un modulo nella cartella App_Code per renderlo più semplice e gestibile.

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

E poi su PreInit di ogni pagina, lo chiamo semplicemente:

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

È abbastanza semplice gestire PreInit e inserire la riga di codice necessaria per caricare la pagina Master corretta.

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

In assenza di qualche motivo convincente per non seguire questa strada, questo è quello che farei, indipendentemente da dove gestisci PreInit.

Sono curioso di sapere cosa decide come dovrebbe apparire la pagina?È l'utente che fa clic su un pulsante per cambiare il tema?Si basa sull'URL utilizzato per accedere al sito?

Il codice dietro è supportato nelle Pagine Master, quindi potresti inserire un po' di logica nella tua Pagina Master per decidere cosa deve essere visualizzato.

Ho visto diversi siti impostare cookie in base ai clic dell'utente (per modificare la dimensione del carattere o la larghezza della pagina) e quindi applicare diversi file CSS in base al valore di tali cookie.Se non è presente alcun cookie, visualizza un aspetto predefinito.

MODIFICARE:

Un altro pensiero qui, se stai semplicemente cercando di cambiare CSS, è impostare il tag di stile in modo che venga eseguito sul server e assegnargli le proprietà in fase di esecuzione.Ancora una volta ciò richiederebbe l'uso di una singola pagina master e l'inserimento del codice code-behind della pagina master, probabilmente nel gestore dell'evento PreInit.

Poiché non ho mai implementato questa soluzione, non sono sicuro se l'intero tag <HEAD> debba essere eseguito sul server o meno.


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

Eredita tutte le tue pagine da una classe base come

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";
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top