我们目前在usercontrol(ascx)中拥有所有跟踪/分析代码。我们喜欢这样,因为使用我们的CMS,我们可以将控件放在任何需要跟踪的页面上。
现在的问题是,用户可能无意中删除了可能已包含该控件的页面上的控件。例如:我们在主页面上包含控件 - 然后再在从该主页继承的页面上。
确保用户控件的最佳方法是在渲染页面时仅使用一次?
答案 0 :(得分:2)
这在很大程度上取决于团队的组成。对于许多团队而言,“最佳”方式只是采用仅包含母版页控件的政策。
如果您不相信您的开发人员遵循此规则,那么还有更多技术解决方案。例如,控件可以在呈现时设置每个请求标志,并每次检查该标志以确保它尚未在该请求上呈现。如果它已经在给定的请求上呈现,它就不会重新渲染。
答案 1 :(得分: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
注意:所有未经测试的
答案 2 :(得分:1)
HttpContext类有一个Items集合,只要正在处理当前请求,您就可以对其进行写入和读取。如果您只是将控件放到页面上,那么您唯一能做的就是让控件本身通过在HttpContext.Current.Items集合中设置一个标志来检查它是否已被加载,如果它已经被加载,请不要不渲染输出。如果你想只加载一次,你可以,而不是将控件放到页面上,编写一个辅助/静态方法来加载控件(比如将devs放到页面上的占位符控件)。然后,辅助方法可以使用HttpContext来确定是否加载控件。
答案 3 :(得分:0)
添加时,您可能会遍历页面上的控件。如果存在,则不要添加它。
答案 4 :(得分:0)
由于这是一个设计时问题,除了再次部署之前测试添加的页面之外,没有什么可以做的。
如果这是在运行时完成的,您可以迭代控件并查找相同的类型。如果找到则删除。