确保只有一次包含UserControl

时间:2011-06-28 14:50:19

标签: asp.net user-controls

我们目前在usercontrol(ascx)中拥有所有跟踪/分析代码。我们喜欢这样,因为使用我们的CMS,我们可以将控件放在任何需要跟踪的页面上。

现在的问题是,用户可能无意中删除了可能已包含该控件的页面上的控件。例如:我们在主页面上包含控件 - 然后再在从该主页继承的页面上。

确保用户控件的最佳方法是在渲染页面时仅使用一次?

5 个答案:

答案 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)

由于这是一个设计时问题,除了再次部署之前测试添加的页面之外,没有什么可以做的。

如果这是在运行时完成的,您可以迭代控件并查找相同的类型。如果找到则删除。