2009-06-26 14 views
0

Ich habe eine Basismasterseite, die die Hauptlayoutvorlage einer Website angibt. Es behandelt auch einige Logik, die Registerkarten abhängig von dem Abschnitt ändert, und legt außerdem Seitenmetainformationen fest.Dynamisch verschachtelte Masterseiten, gemeinsame Eigenschaften

Ich lade verschachtelte Masterseiten dynamisch, indem ich den Querystring betrachte, einen Datensatz aus der Datenbank hochlade und die verschachtelte Masterseite dynamisch auf der Grundlage eines Wertes festlege, der in diesem Datensatz gefunden wurde. Ich muss dynamisch verschachtelte Masterseiten für Layout und funktionale Unterschiede laden.

Es gibt zusätzliche Informationen in diesem Datensatz, die ich in der Basismasterseite und in der dynamisch geladenen Masterseite verwenden möchte, damit ich zusätzliche Datenbankaufrufe vermeiden kann.

Derzeit habe ich eine Klasse eingerichtet, die MasterPage als Basisklasse für die Basismasterseite erbt. Ich habe eine gemeinsame (statische) Eigenschaft, die das Objekt enthält, das den Datenbankaufruf darstellt, den ich zwischen der Basismasterseite und der verschachtelten, dynamisch aufgerufenen Masterseite freigeben möchte.

Es funktioniert, aber es scheint ein wenig hässlich. Gibt es noch andere bessere Lösungen?

Antwort

0

Ok, ich musste auf diesem ein wenig schlafen, aber ich kam mit einer saubereren Lösung. Ich habe am Ende eine Basisklasse für die Seite anstelle einer Basisklasse für die Masterseite verwendet. Die Basisseite legt das Meta fest, das ich in der Basismasterseite festlegen würde.

Public Class PageBase 
    Inherits Page 

    Private _DocDetails As FolderDocument 
    Public Overridable ReadOnly Property DocDetails() As FolderDocument 
     Get 
      Return _DocDetails 
     End Get 
    End Property 

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Not Page.IsPostBack() Then 
      SetMeta() 
     End If 
    End Sub 

    Protected Sub SetMeta() 

     If DocDetails IsNot Nothing Then 
      Page.Title = DocDetails.MetaTitle 
      If DocDetails.MetaKeywords <> String.Empty Then 
       Dim metaKeywords As New HtmlMeta() 
       metaKeywords.Name = "Keywords" 
       metaKeywords.Content = DocDetails.MetaKeywords 
       Page.Header.Controls.Add(metaKeywords) 
      End If 
      If DocDetails.MetaDescription <> String.Empty Then 
       Dim metaDescription As New HtmlMeta() 
       metaDescription.Name = "Description" 
       metaDescription.Content = DocDetails.MetaDescription 
       Page.Header.Controls.Add(metaDescription) 
      End If 
     End If 

    End Sub 

End Class 

..Und dann erbt die ASPX-Seite diese Basisseite und legt die Masterseite dynamisch fest.

<%@ Page Language="VB" Inherits="PageBase" %> 
<script runat="server"> 

    Private _DocDetails As FolderDocument 
    Public Overrides ReadOnly Property DocDetails() As FolderDocument 
     Get 
      Return _DocDetails 
     End Get 
    End Property 

    Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) 
     _DocDetails = FolderDocuments.GetFolderDocument() 

     If _DocDetails IsNot Nothing Then 
      If _DocDetails.MasterPage <> "" Then 
       Me.MasterPageFile = String.Format("~/templates/{0}.master", _DocDetails.MasterPage) 
      End If 
     End If 

    End Sub 
</script> 

... und im dynamisch Master-Seite aufgerufen kann ich die Basisklasse Seite Referenz durch Gießen:

Dim parentPage As PageBase = DirectCast(Page, PageBase) 
Response.write(parentPage.DocDetails.Title) 
0

Sie könnten den Datensatz immer in der HttpContext.Items-Auflistung übergeben. Sobald es in der Items-Sammlung ist, ist es für alle Dinge verfügbar, die den HttpContext für die Dauer der Anfrage erreichen können.

+0

Ja, das würde funktionieren, aber soweit ich weiß, Sie verlieren starke Typisierung (ohne etwas zusätzliche Arbeit). – ScottE

+0

Ich habe in der Regel Situationen umgebrochen, in denen ich Objekte über die HttpContext.Items-Auflistung mit einer statischen Eigenschaftenklasse oder einer Instanzklasse übergeben muss. Das heißt, ich hätte so etwas wie eine ContextItems-Klasse, die eine Eigenschaft für die Daten hat, die ich in Elemente einfüge. Ich tippe dort hinein, um die Daten aus der Items-Sammlung als eingetippte Klasse zurückzugeben. –

Verwandte Themen