Убедитесь, что UserControl включен только один раз - PullRequest
1 голос
/ 28 июня 2011

В настоящее время у нас есть весь наш код отслеживания / аналитики в пользовательском контроле (ascx). Нам это нравится, потому что, используя нашу CMS, мы можем просто отбросить элемент управления на любой странице, которая требует отслеживания.

Проблема в том, что теперь пользователь может непреднамеренно удалить элемент управления на странице, на которой он уже может быть включен. Например: мы включаем элемент управления в главную страницу, а затем снова в страницу, которая наследуется от этой главной страницы.

Как лучше всего обеспечить, чтобы пользовательский элемент управления использовался только один раз при отображении страницы?

Ответы [ 5 ]

2 голосов
/ 28 июня 2011

Это во многом зависит от состава вашей команды. Для многих команд «лучшим» способом было бы просто принять политику включения только элемента управления на главных страницах .

Существуют и другие технические решения, если вы не можете доверить своим разработчикам следовать этому правилу. Например, элемент управления может установить флаг для каждого запроса при его рендеринге и каждый раз проверять этот флаг, чтобы убедиться, что он еще не был обработан в этом запросе. Если он уже был обработан по данному запросу, он просто не будет повторно отображаться.

1 голос
/ 28 июня 2011

Класс HttpContext имеет коллекцию Items, в которую вы можете записывать и считывать данные из жизни, пока обрабатывается текущий запрос.Если вы просто перетаскиваете элемент управления на страницу, единственное, что вы можете сделать, - это проверить сам элемент управления, чтобы определить, был ли он загружен, установив флаг в коллекции HttpContext.Current.Items и, если он уже был загружен,не выводить вывод.Если вы хотите быть умным в отношении загрузки только один раз, вы можете вместо того, чтобы перетаскивать элемент управления на страницу, написать вспомогательный / статический метод для загрузки элемента управления (скажем, в элемент-заполнитель, который разработчики помещают на страницу).Затем вспомогательный метод может использовать HttpContext, чтобы определить, следует ли загружать элемент управления.

1 голос
/ 28 июня 2011

Нет никакого способа, чем зациклить все элементы управления и их родителей / детей.

Например:

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 голосов
/ 28 июня 2011

Поскольку это проблема времени разработки, вы не можете ничего сделать, кроме как проверить страницу, к которой она добавлена, перед повторным развертыванием.

Если это сделано во время выполнения, вы можете перебрать элементы управления и искать тот же тип. Удалить, если найдено.

0 голосов
/ 28 июня 2011

Вы, возможно, могли бы перебрать элементы управления на странице при добавлении.Если он существует, не добавляйте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...