代码之家  ›  专栏  ›  技术社区  ›  ScottE

动态嵌套母版页,共享属性

  •  0
  • ScottE  · 技术社区  · 15 年前

    我有一个基本母版页,它指定了一个网站的主布局模板。它还处理一些逻辑,这些逻辑根据节更改选项卡,并设置页面元信息。

    我正在动态加载嵌套的母版页,方法是查看querystring,从数据库中加载一条记录,并根据该记录中的值动态设置嵌套的母版页。我需要为布局和功能差异加载动态嵌套母版页。

    该记录中有一些附加信息,我希望在基本母版页和动态加载的母版页中使用这些信息,以便避免其他数据库调用。

    目前,我已经设置了一个继承master page的类,作为基本母版页的基类。我有一个共享(静态)属性,它保存了表示数据库调用的对象,我希望在基本母版页和嵌套的、动态调用的母版页之间共享该调用。

    它起作用了,但看起来有点难看。还有其他更好的解决方案吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Larry Beall    15 年前

    您可以始终在httpContext.items集合中传递记录。一旦它在items集合中,它就可以用于在请求期间可以到达httpcontext的所有事物。

        2
  •  0
  •   ScottE    15 年前

    好吧,我得睡一会儿,但我想出了一个更干净的解决方案。我最终使用的是页面的基类,而不是母版页的基类。基本页设置我要在基本母版页中设置的元。

    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)