#asp.net #vb.net
#asp.net #vb.net
Вопрос:
Я пытаюсь установить атрибут класса элемента списка при загрузке страницы.
Dim liItem As HtmlGenericControl = DirectCast(Page.FindControl("default"), HtmlGenericControl)
liItem.Attributes.Add("class", "active")
Этот код не работает, не совсем уверен, почему.
Это ошибка, которую он генерирует
«Исключение NullReferenceException: ссылка на объект не установлена для экземпляра объекта»
Ответ №1:
Если вы знаете, что элемент управления находится на главной странице, вы должны делать:
Dim liItem As HtmlGenericControl = DirectCast(Me.Master.FindControl("default"))
Ответ №2:
Другая возможная проблема заключается в том, что объявление элемента управления «по умолчанию» (на странице) не имеет идентификатора и не имеет директивы runat=»server». Оба этих элемента должны быть установлены в элементе управления, чтобы FindControl мог найти элемент управления.
Комментарии:
1. установлен runat=»сервер», а идентификатор li равен «по умолчанию». li являются частью <ul> на главной странице. Как мне искать элемент управления после объединения главной и содержательной страниц? или мне сделать это раньше?
2. Я думаю, что вам нужно рекурсивно выполнить поиск по элементам управления. Создайте новый рекурсивный метод, который принимает ControlCollection в качестве параметра и передает ему коллекцию элементов управления страницы. В методе выполните цикл по каждому элементу управления в коллекции, затем, если данный элемент управления в коллекции имеет элементы управления, вызовите свой метод с помощью коллекции элементов управления этого элемента управления. Обычно я устанавливаю возвращаемое значение для метода и выполняю резервное копирование цепочки вызовов, как только я нашел элемент управления, который я ищу.
Ответ №3:
В этом случае исключение не становится намного понятнее. Исключение NullReferenceException указывает здесь, что liItem
значение равно нулю. Это означает, что либо на странице с именем «по умолчанию» нет элемента управления (вероятно), либо что DirectCast не работал (менее вероятно, но тоже возможно). Следует иметь в виду, что элемент управления вряд ли будет встроен в коллекцию элементов управления страницы.
Если элемент управления с пометкой «по умолчанию» содержится в элементе управления Panel или аналогичном элементе управления контейнера, вам нужно будет использовать метод FindControl этого конкретного элемента управления. Другим способом получения элемента управления было бы написать метод расширения, чтобы переопределить метод FindControl как рекурсивный (потенциально тяжелый метод).
Редактировать:
При доступе к элементам с главной страницы таким образом я предпочитаю использовать догадки. Обычно я устанавливаю свойство на своей главной странице, которое содержит рассматриваемое значение или элемент управления, например:
Public Property LI_Default() As HtmlGenericControl
Get
Return Me.Default ' Assumes the name specified in the question
End Get
End Property
Теперь это не доступно сразу страницам, которые используют главную страницу, поэтому вам нужно объявить основной тип внутри самой страницы aspx:
<%@ MasterType VirtualPath="~/Path/To/My/Master.master" %>
С помощью этого объявления у вас теперь есть доступ к созданному вами свойству, и вам больше не нужно беспокоиться о «поиске» элемента управления.
Protected Sub Page_Load(ByVal sender as Object, ByVal e as EventArgs) Handles Me.Load
If Me.Master IsNot Nothing Then
Me.Master.LI_Default.Attributes.Add("class", "active")
End If
End Sub
Комментарии:
1. li находятся на главной странице. Я пытаюсь установить для атрибута класса значение «активный» при нажатии на li. Вот код на главной странице. Я пытаюсь установить атрибут из вызова страницы содержимого в событии загрузки страницы
2. @dinotom: я опубликую редактирование, показывающее мой предпочтительный метод выполнения этого.