2011-06-28 12 views
1

我們目前已將所有跟蹤/分析代碼放在usercontrol(ascx)中。我們喜歡這一點,因爲使用我們的CMS,我們可以將控件放在任何需要跟蹤的頁面上。確保用戶控件只包含一次

現在的問題是,用戶可能會無意中在可能已包含該控件的頁面上放置控件。例如:我們將控件包含在母版頁上 - 然後再次在從此母版繼承的頁面上。

確保用戶控件的最佳方式是什麼?在渲染頁面時僅使用一次?

回答

1

沒有辦法讓循環所有的控件和他們的父母/孩子。

例如:

Public Module ExtensionMethods 

    <Runtime.CompilerServices.Extension()> _ 
    Public Function FindControlRecursively(ByVal parentControl As System.Web.UI.Control, ByVal controlType As Type) As System.Web.UI.Control 

     If parentControl.GetType = controlType Then 
      Return parentControl 
     End If 

     For Each c As System.Web.UI.Control In parentControl.Controls 
      Dim child As System.Web.UI.Control = FindControlRecursively(c, controlType) 
      If child IsNot Nothing Then 
       Return child 
      End If 
     Next 

     Return Nothing 

    End Function 

End Module 

,你可以檢查它這樣:

If Not FindControlRecursively(Me.Page.Master, GetType(UC_Status)) Is Nothing Then 
    'thow exception or whatever' 
End If 

注:所有未測試

+0

太棒了,謝謝蒂姆。這似乎是我正在尋找的。 – cschear

0

當你添加它時你可能會循環頁面上的控件。如果存在,則不要添加它。

+0

有關如何做到這一點的任何示例?它可以從控制本身完成嗎? – cschear

2

這很大程度上取決於您的團隊的組成。對於許多團隊來說,「最好」的方式只不過是對採取僅包括對主頁的控制權的政策。

雖然有更多的技術解決方案,如果你不能相信你的開發者遵循這個規則。例如,控件可以在呈現時設置每個請求標誌,並且每次檢查該標誌以確保它尚未在該請求上呈現。如果它已經在給定的請求上呈現,它將不會重新呈現。

+0

我同意 - 只是希望有一個比這更可靠的答案。 – cschear

+0

@Chris:如果你的開發者不可靠,那是另一回事。我編輯了我的帖子。 – StriplingWarrior

+0

謝謝,這有幫助。更多沿着非開發人員的路線不能依賴於這個標準。 – cschear

0

由於這是一個設計時間問題,除了在再次部署之前測試添加到的頁面之外,您可以做的事情不多。

如果這是在運行時完成的,則可以迭代控件並查找相同的類型。刪除,如果找到。

1

HttpContext類有一個項目集合,你可以寫信給並且只要當前的請求正在被處理,就從中讀取。如果你只是把控件放到頁面上,你唯一可以做的就是讓控件自己檢查它是否已經通過在HttpContext.Current.Items集合中設置一個標誌來加載它,如果它已經被加載,不要不顯示輸出。如果你想只加載一次,你可以不用將控件放到頁面上,而是編寫一個輔助/靜態方法來加載控件(比如放入一個佔位符控件,devs放在頁面上)。該幫助器方法可以使用HttpContext來確定是否加載該控件。

相關問題