Динамические вложенные главные страницы, общие свойства - PullRequest
0 голосов
/ 26 июня 2009

У меня есть основная мастер-страница, которая определяет основной шаблон макета сайта. Он также обрабатывает некоторую логику, которая меняет вкладки в зависимости от раздела, а также устанавливает метаинформацию страницы.

Я динамически загружаю вложенные главные страницы, просматривая строку запроса, загружая запись из базы данных и устанавливая вложенную главную страницу динамически на основе значения, найденного в этой записи. Мне нужно загружать динамические вложенные главные страницы для разметки и функциональных различий.

В этой записи есть дополнительная информация, которую я хочу использовать на базовой главной странице и на динамически загружаемой главной странице, чтобы я мог избежать дополнительных вызовов базы данных.

В настоящее время я настроил класс, который наследует MasterPage, чтобы действовать как базовый класс для базовой главной страницы. У меня есть общее (статическое) свойство, которое содержит объект, представляющий вызов базы данных, который я хочу разделить между базовой главной страницей и вложенной, динамически называемой главной страницей.

Это работает, но кажется немного уродливым. Есть ли другие лучшие решения?

Ответы [ 2 ]

0 голосов
/ 26 июня 2009

Хорошо, мне пришлось немного поспать, но я нашел более чистое решение. В итоге я использовал базовый класс для страницы вместо базового класса для главной страницы. Базовая страница устанавливает мета, которую я собирался установить на базовой главной странице.

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

.. А затем страница aspx наследует эту базовую страницу и динамически устанавливает главную страницу.

<%@ 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>

... и в динамически вызываемой главной странице я могу сослаться на базовый класс страницы, приведя:

Dim parentPage As PageBase = DirectCast(Page, PageBase)
Response.write(parentPage.DocDetails.Title)
0 голосов
/ 26 июня 2009

Вы всегда можете передать запись в коллекцию HttpContext.Items. Как только он попадает в коллекцию Items, он становится доступным каждому, что может достичь HttpContext на время запроса.

...