我們目前已將所有跟蹤/分析代碼放在usercontrol(ascx)中。我們喜歡這一點,因爲使用我們的CMS,我們可以將控件放在任何需要跟蹤的頁面上。確保用戶控件只包含一次
現在的問題是,用戶可能會無意中在可能已包含該控件的頁面上放置控件。例如:我們將控件包含在母版頁上 - 然後再次在從此母版繼承的頁面上。
確保用戶控件的最佳方式是什麼?在渲染頁面時僅使用一次?
我們目前已將所有跟蹤/分析代碼放在usercontrol(ascx)中。我們喜歡這一點,因爲使用我們的CMS,我們可以將控件放在任何需要跟蹤的頁面上。確保用戶控件只包含一次
現在的問題是,用戶可能會無意中在可能已包含該控件的頁面上放置控件。例如:我們將控件包含在母版頁上 - 然後再次在從此母版繼承的頁面上。
確保用戶控件的最佳方式是什麼?在渲染頁面時僅使用一次?
沒有辦法讓循環所有的控件和他們的父母/孩子。
例如:
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
注:所有未測試
這很大程度上取決於您的團隊的組成。對於許多團隊來說,「最好」的方式只不過是對採取僅包括對主頁的控制權的政策。
雖然有更多的技術解決方案,如果你不能相信你的開發者遵循這個規則。例如,控件可以在呈現時設置每個請求標誌,並且每次檢查該標誌以確保它尚未在該請求上呈現。如果它已經在給定的請求上呈現,它將不會重新呈現。
我同意 - 只是希望有一個比這更可靠的答案。 – cschear
@Chris:如果你的開發者不可靠,那是另一回事。我編輯了我的帖子。 – StriplingWarrior
謝謝,這有幫助。更多沿着非開發人員的路線不能依賴於這個標準。 – cschear
由於這是一個設計時間問題,除了在再次部署之前測試添加到的頁面之外,您可以做的事情不多。
如果這是在運行時完成的,則可以迭代控件並查找相同的類型。刪除,如果找到。
HttpContext類有一個項目集合,你可以寫信給並且只要當前的請求正在被處理,就從中讀取。如果你只是把控件放到頁面上,你唯一可以做的就是讓控件自己檢查它是否已經通過在HttpContext.Current.Items集合中設置一個標誌來加載它,如果它已經被加載,不要不顯示輸出。如果你想只加載一次,你可以不用將控件放到頁面上,而是編寫一個輔助/靜態方法來加載控件(比如放入一個佔位符控件,devs放在頁面上)。該幫助器方法可以使用HttpContext來確定是否加載該控件。
太棒了,謝謝蒂姆。這似乎是我正在尋找的。 – cschear