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" %>