ASP.NET UserControl не инициализирует дочерние элементы управления
Внутри моей страницы у меня есть следующее:
<aspe:UpdatePanel runat="server" ID="updatePanel">
<ContentTemplate>
<local:KeywordSelector runat="server" ID="ksKeywords" />
</ContentTemplate>
</aspe:UpdatePanel>
Элемент KeywordSelector
- это элемент управления, который я определяю в той же сборке, и local
отображается в его пространство имен.
Элемент управления состоит из нескольких других элементов управления и определяется как таковой:
<%@ Control Language="C#" AutoEventWireup="true"
CodeBehind="KeywordSelector.ascx.cs"
Inherits="Keywords.KeywordSelector" %>
и имеет довольно много собственных элементов управления сервером, все они определены как члены в файле .designer.cs
.
Однако в течение какой-либо части жизненного цикла элемента управления не имеет никаких дочерних элементов управления и не создает HTML:
- Все члены, определенные в файле
.designer.cs
, null
.
- Вызов
HasControls
return false
.
- Вызов
EnsureChildControls
ничего не делает.
- Коллекция
Controls
пуста.
Удаление UpdatePanel
не принесло пользы. Я попытался воспроизвести его на чистой странице с помощью нового UserControl
, и произойдет то же самое.
Я использую ASP.NET поверх .NET Framework 3.5 с пакетом обновления 1 (SP1) со встроенным веб-сервером.
Что мне здесь не хватает?
Обновление # 1: Следуя комментарию Rob, я просмотрел OnInit
и обнаружил, что UserControl
не обнаруживает, что у него есть дочерние элементы управления. Более того, CreateControlCollection
никогда не вызывается!
Ответы
Ответ 1
Ну, я нашел проблему (ы):
-
Элементы управления пользователя, в отличие от пользовательских элементов управления, должны быть зарегистрированы один за другим в файле web.config. Сделайте это:
<add tagPrefix="local" tagName="KeywordSelector" src="~/KeywordSelector.ascx" />
вместо:
<add tagPrefix="local" namespace="Keywords" assembly="Keywords" />
-
Вы не должны размещать WebControl
в том же каталоге, что и Control
, который его использует. Это совершенно глупо. Читайте об этом здесь.
Спасибо за помощь. Теперь, если бы только я мог отметить свой ответ как ответ...
Ответ 2
В моем случае причиной было то, что Resharper 7.1 добавила неверную директиву @Register в верхней части aspx - вместо этой нужной строки:
<%@ Register Src="~/Controls/Hello/Hello.ascx" TagName="Hello" TagPrefix="p" %>
У меня есть неправильный:
<%@ Register TagPrefix="p" Namespace="MyNamespace.WebApp.Controls" Assembly="MyApp.Web" %>